xref: /aosp_15_r20/external/clang/lib/AST/DeclCXX.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the C++ related Decl classes.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li #include "clang/AST/DeclCXX.h"
14*67e74705SXin Li #include "clang/AST/ASTContext.h"
15*67e74705SXin Li #include "clang/AST/ASTLambda.h"
16*67e74705SXin Li #include "clang/AST/ASTMutationListener.h"
17*67e74705SXin Li #include "clang/AST/CXXInheritance.h"
18*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
19*67e74705SXin Li #include "clang/AST/Expr.h"
20*67e74705SXin Li #include "clang/AST/ExprCXX.h"
21*67e74705SXin Li #include "clang/AST/TypeLoc.h"
22*67e74705SXin Li #include "clang/Basic/IdentifierTable.h"
23*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
24*67e74705SXin Li #include "llvm/ADT/SmallPtrSet.h"
25*67e74705SXin Li using namespace clang;
26*67e74705SXin Li 
27*67e74705SXin Li //===----------------------------------------------------------------------===//
28*67e74705SXin Li // Decl Allocation/Deallocation Method Implementations
29*67e74705SXin Li //===----------------------------------------------------------------------===//
30*67e74705SXin Li 
anchor()31*67e74705SXin Li void AccessSpecDecl::anchor() { }
32*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)33*67e74705SXin Li AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
34*67e74705SXin Li   return new (C, ID) AccessSpecDecl(EmptyShell());
35*67e74705SXin Li }
36*67e74705SXin Li 
getFromExternalSource(ASTContext & C) const37*67e74705SXin Li void LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const {
38*67e74705SXin Li   ExternalASTSource *Source = C.getExternalSource();
39*67e74705SXin Li   assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set");
40*67e74705SXin Li   assert(Source && "getFromExternalSource with no external source");
41*67e74705SXin Li 
42*67e74705SXin Li   for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I)
43*67e74705SXin Li     I.setDecl(cast<NamedDecl>(Source->GetExternalDecl(
44*67e74705SXin Li         reinterpret_cast<uintptr_t>(I.getDecl()) >> 2)));
45*67e74705SXin Li   Impl.Decls.setLazy(false);
46*67e74705SXin Li }
47*67e74705SXin Li 
DefinitionData(CXXRecordDecl * D)48*67e74705SXin Li CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
49*67e74705SXin Li     : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
50*67e74705SXin Li       Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
51*67e74705SXin Li       Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
52*67e74705SXin Li       HasPrivateFields(false), HasProtectedFields(false),
53*67e74705SXin Li       HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
54*67e74705SXin Li       HasOnlyCMembers(true), HasInClassInitializer(false),
55*67e74705SXin Li       HasUninitializedReferenceMember(false), HasUninitializedFields(false),
56*67e74705SXin Li       HasInheritedConstructor(false), HasInheritedAssignment(false),
57*67e74705SXin Li       NeedOverloadResolutionForMoveConstructor(false),
58*67e74705SXin Li       NeedOverloadResolutionForMoveAssignment(false),
59*67e74705SXin Li       NeedOverloadResolutionForDestructor(false),
60*67e74705SXin Li       DefaultedMoveConstructorIsDeleted(false),
61*67e74705SXin Li       DefaultedMoveAssignmentIsDeleted(false),
62*67e74705SXin Li       DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
63*67e74705SXin Li       DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true),
64*67e74705SXin Li       HasConstexprNonCopyMoveConstructor(false),
65*67e74705SXin Li       HasDefaultedDefaultConstructor(false),
66*67e74705SXin Li       DefaultedDefaultConstructorIsConstexpr(true),
67*67e74705SXin Li       HasConstexprDefaultConstructor(false),
68*67e74705SXin Li       HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
69*67e74705SXin Li       UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
70*67e74705SXin Li       ImplicitCopyConstructorHasConstParam(true),
71*67e74705SXin Li       ImplicitCopyAssignmentHasConstParam(true),
72*67e74705SXin Li       HasDeclaredCopyConstructorWithConstParam(false),
73*67e74705SXin Li       HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
74*67e74705SXin Li       IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0), Bases(),
75*67e74705SXin Li       VBases(), Definition(D), FirstFriend() {}
76*67e74705SXin Li 
getBasesSlowCase() const77*67e74705SXin Li CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
78*67e74705SXin Li   return Bases.get(Definition->getASTContext().getExternalSource());
79*67e74705SXin Li }
80*67e74705SXin Li 
getVBasesSlowCase() const81*67e74705SXin Li CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
82*67e74705SXin Li   return VBases.get(Definition->getASTContext().getExternalSource());
83*67e74705SXin Li }
84*67e74705SXin Li 
CXXRecordDecl(Kind K,TagKind TK,const ASTContext & C,DeclContext * DC,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,CXXRecordDecl * PrevDecl)85*67e74705SXin Li CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C,
86*67e74705SXin Li                              DeclContext *DC, SourceLocation StartLoc,
87*67e74705SXin Li                              SourceLocation IdLoc, IdentifierInfo *Id,
88*67e74705SXin Li                              CXXRecordDecl *PrevDecl)
89*67e74705SXin Li     : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl),
90*67e74705SXin Li       DefinitionData(PrevDecl ? PrevDecl->DefinitionData
91*67e74705SXin Li                               : nullptr),
92*67e74705SXin Li       TemplateOrInstantiation() {}
93*67e74705SXin Li 
Create(const ASTContext & C,TagKind TK,DeclContext * DC,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,CXXRecordDecl * PrevDecl,bool DelayTypeCreation)94*67e74705SXin Li CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
95*67e74705SXin Li                                      DeclContext *DC, SourceLocation StartLoc,
96*67e74705SXin Li                                      SourceLocation IdLoc, IdentifierInfo *Id,
97*67e74705SXin Li                                      CXXRecordDecl* PrevDecl,
98*67e74705SXin Li                                      bool DelayTypeCreation) {
99*67e74705SXin Li   CXXRecordDecl *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc,
100*67e74705SXin Li                                                IdLoc, Id, PrevDecl);
101*67e74705SXin Li   R->MayHaveOutOfDateDef = C.getLangOpts().Modules;
102*67e74705SXin Li 
103*67e74705SXin Li   // FIXME: DelayTypeCreation seems like such a hack
104*67e74705SXin Li   if (!DelayTypeCreation)
105*67e74705SXin Li     C.getTypeDeclType(R, PrevDecl);
106*67e74705SXin Li   return R;
107*67e74705SXin Li }
108*67e74705SXin Li 
109*67e74705SXin Li CXXRecordDecl *
CreateLambda(const ASTContext & C,DeclContext * DC,TypeSourceInfo * Info,SourceLocation Loc,bool Dependent,bool IsGeneric,LambdaCaptureDefault CaptureDefault)110*67e74705SXin Li CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC,
111*67e74705SXin Li                             TypeSourceInfo *Info, SourceLocation Loc,
112*67e74705SXin Li                             bool Dependent, bool IsGeneric,
113*67e74705SXin Li                             LambdaCaptureDefault CaptureDefault) {
114*67e74705SXin Li   CXXRecordDecl *R =
115*67e74705SXin Li       new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc,
116*67e74705SXin Li                                 nullptr, nullptr);
117*67e74705SXin Li   R->IsBeingDefined = true;
118*67e74705SXin Li   R->DefinitionData =
119*67e74705SXin Li       new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric,
120*67e74705SXin Li                                           CaptureDefault);
121*67e74705SXin Li   R->MayHaveOutOfDateDef = false;
122*67e74705SXin Li   R->setImplicit(true);
123*67e74705SXin Li   C.getTypeDeclType(R, /*PrevDecl=*/nullptr);
124*67e74705SXin Li   return R;
125*67e74705SXin Li }
126*67e74705SXin Li 
127*67e74705SXin Li CXXRecordDecl *
CreateDeserialized(const ASTContext & C,unsigned ID)128*67e74705SXin Li CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
129*67e74705SXin Li   CXXRecordDecl *R = new (C, ID) CXXRecordDecl(
130*67e74705SXin Li       CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(),
131*67e74705SXin Li       nullptr, nullptr);
132*67e74705SXin Li   R->MayHaveOutOfDateDef = false;
133*67e74705SXin Li   return R;
134*67e74705SXin Li }
135*67e74705SXin Li 
136*67e74705SXin Li void
setBases(CXXBaseSpecifier const * const * Bases,unsigned NumBases)137*67e74705SXin Li CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
138*67e74705SXin Li                         unsigned NumBases) {
139*67e74705SXin Li   ASTContext &C = getASTContext();
140*67e74705SXin Li 
141*67e74705SXin Li   if (!data().Bases.isOffset() && data().NumBases > 0)
142*67e74705SXin Li     C.Deallocate(data().getBases());
143*67e74705SXin Li 
144*67e74705SXin Li   if (NumBases) {
145*67e74705SXin Li     if (!C.getLangOpts().CPlusPlus1z) {
146*67e74705SXin Li       // C++ [dcl.init.aggr]p1:
147*67e74705SXin Li       //   An aggregate is [...] a class with [...] no base classes [...].
148*67e74705SXin Li       data().Aggregate = false;
149*67e74705SXin Li     }
150*67e74705SXin Li 
151*67e74705SXin Li     // C++ [class]p4:
152*67e74705SXin Li     //   A POD-struct is an aggregate class...
153*67e74705SXin Li     data().PlainOldData = false;
154*67e74705SXin Li   }
155*67e74705SXin Li 
156*67e74705SXin Li   // The set of seen virtual base types.
157*67e74705SXin Li   llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
158*67e74705SXin Li 
159*67e74705SXin Li   // The virtual bases of this class.
160*67e74705SXin Li   SmallVector<const CXXBaseSpecifier *, 8> VBases;
161*67e74705SXin Li 
162*67e74705SXin Li   data().Bases = new(C) CXXBaseSpecifier [NumBases];
163*67e74705SXin Li   data().NumBases = NumBases;
164*67e74705SXin Li   for (unsigned i = 0; i < NumBases; ++i) {
165*67e74705SXin Li     data().getBases()[i] = *Bases[i];
166*67e74705SXin Li     // Keep track of inherited vbases for this base class.
167*67e74705SXin Li     const CXXBaseSpecifier *Base = Bases[i];
168*67e74705SXin Li     QualType BaseType = Base->getType();
169*67e74705SXin Li     // Skip dependent types; we can't do any checking on them now.
170*67e74705SXin Li     if (BaseType->isDependentType())
171*67e74705SXin Li       continue;
172*67e74705SXin Li     CXXRecordDecl *BaseClassDecl
173*67e74705SXin Li       = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
174*67e74705SXin Li 
175*67e74705SXin Li     if (!BaseClassDecl->isEmpty()) {
176*67e74705SXin Li       if (!data().Empty) {
177*67e74705SXin Li         // C++0x [class]p7:
178*67e74705SXin Li         //   A standard-layout class is a class that:
179*67e74705SXin Li         //    [...]
180*67e74705SXin Li         //    -- either has no non-static data members in the most derived
181*67e74705SXin Li         //       class and at most one base class with non-static data members,
182*67e74705SXin Li         //       or has no base classes with non-static data members, and
183*67e74705SXin Li         // If this is the second non-empty base, then neither of these two
184*67e74705SXin Li         // clauses can be true.
185*67e74705SXin Li         data().IsStandardLayout = false;
186*67e74705SXin Li       }
187*67e74705SXin Li 
188*67e74705SXin Li       // C++14 [meta.unary.prop]p4:
189*67e74705SXin Li       //   T is a class type [...] with [...] no base class B for which
190*67e74705SXin Li       //   is_empty<B>::value is false.
191*67e74705SXin Li       data().Empty = false;
192*67e74705SXin Li       data().HasNoNonEmptyBases = false;
193*67e74705SXin Li     }
194*67e74705SXin Li 
195*67e74705SXin Li     // C++1z [dcl.init.agg]p1:
196*67e74705SXin Li     //   An aggregate is a class with [...] no private or protected base classes
197*67e74705SXin Li     if (Base->getAccessSpecifier() != AS_public)
198*67e74705SXin Li       data().Aggregate = false;
199*67e74705SXin Li 
200*67e74705SXin Li     // C++ [class.virtual]p1:
201*67e74705SXin Li     //   A class that declares or inherits a virtual function is called a
202*67e74705SXin Li     //   polymorphic class.
203*67e74705SXin Li     if (BaseClassDecl->isPolymorphic())
204*67e74705SXin Li       data().Polymorphic = true;
205*67e74705SXin Li 
206*67e74705SXin Li     // C++0x [class]p7:
207*67e74705SXin Li     //   A standard-layout class is a class that: [...]
208*67e74705SXin Li     //    -- has no non-standard-layout base classes
209*67e74705SXin Li     if (!BaseClassDecl->isStandardLayout())
210*67e74705SXin Li       data().IsStandardLayout = false;
211*67e74705SXin Li 
212*67e74705SXin Li     // Record if this base is the first non-literal field or base.
213*67e74705SXin Li     if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C))
214*67e74705SXin Li       data().HasNonLiteralTypeFieldsOrBases = true;
215*67e74705SXin Li 
216*67e74705SXin Li     // Now go through all virtual bases of this base and add them.
217*67e74705SXin Li     for (const auto &VBase : BaseClassDecl->vbases()) {
218*67e74705SXin Li       // Add this base if it's not already in the list.
219*67e74705SXin Li       if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
220*67e74705SXin Li         VBases.push_back(&VBase);
221*67e74705SXin Li 
222*67e74705SXin Li         // C++11 [class.copy]p8:
223*67e74705SXin Li         //   The implicitly-declared copy constructor for a class X will have
224*67e74705SXin Li         //   the form 'X::X(const X&)' if each [...] virtual base class B of X
225*67e74705SXin Li         //   has a copy constructor whose first parameter is of type
226*67e74705SXin Li         //   'const B&' or 'const volatile B&' [...]
227*67e74705SXin Li         if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
228*67e74705SXin Li           if (!VBaseDecl->hasCopyConstructorWithConstParam())
229*67e74705SXin Li             data().ImplicitCopyConstructorHasConstParam = false;
230*67e74705SXin Li 
231*67e74705SXin Li         // C++1z [dcl.init.agg]p1:
232*67e74705SXin Li         //   An aggregate is a class with [...] no virtual base classes
233*67e74705SXin Li         data().Aggregate = false;
234*67e74705SXin Li       }
235*67e74705SXin Li     }
236*67e74705SXin Li 
237*67e74705SXin Li     if (Base->isVirtual()) {
238*67e74705SXin Li       // Add this base if it's not already in the list.
239*67e74705SXin Li       if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
240*67e74705SXin Li         VBases.push_back(Base);
241*67e74705SXin Li 
242*67e74705SXin Li       // C++14 [meta.unary.prop] is_empty:
243*67e74705SXin Li       //   T is a class type, but not a union type, with ... no virtual base
244*67e74705SXin Li       //   classes
245*67e74705SXin Li       data().Empty = false;
246*67e74705SXin Li 
247*67e74705SXin Li       // C++1z [dcl.init.agg]p1:
248*67e74705SXin Li       //   An aggregate is a class with [...] no virtual base classes
249*67e74705SXin Li       data().Aggregate = false;
250*67e74705SXin Li 
251*67e74705SXin Li       // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
252*67e74705SXin Li       //   A [default constructor, copy/move constructor, or copy/move assignment
253*67e74705SXin Li       //   operator for a class X] is trivial [...] if:
254*67e74705SXin Li       //    -- class X has [...] no virtual base classes
255*67e74705SXin Li       data().HasTrivialSpecialMembers &= SMF_Destructor;
256*67e74705SXin Li 
257*67e74705SXin Li       // C++0x [class]p7:
258*67e74705SXin Li       //   A standard-layout class is a class that: [...]
259*67e74705SXin Li       //    -- has [...] no virtual base classes
260*67e74705SXin Li       data().IsStandardLayout = false;
261*67e74705SXin Li 
262*67e74705SXin Li       // C++11 [dcl.constexpr]p4:
263*67e74705SXin Li       //   In the definition of a constexpr constructor [...]
264*67e74705SXin Li       //    -- the class shall not have any virtual base classes
265*67e74705SXin Li       data().DefaultedDefaultConstructorIsConstexpr = false;
266*67e74705SXin Li     } else {
267*67e74705SXin Li       // C++ [class.ctor]p5:
268*67e74705SXin Li       //   A default constructor is trivial [...] if:
269*67e74705SXin Li       //    -- all the direct base classes of its class have trivial default
270*67e74705SXin Li       //       constructors.
271*67e74705SXin Li       if (!BaseClassDecl->hasTrivialDefaultConstructor())
272*67e74705SXin Li         data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
273*67e74705SXin Li 
274*67e74705SXin Li       // C++0x [class.copy]p13:
275*67e74705SXin Li       //   A copy/move constructor for class X is trivial if [...]
276*67e74705SXin Li       //    [...]
277*67e74705SXin Li       //    -- the constructor selected to copy/move each direct base class
278*67e74705SXin Li       //       subobject is trivial, and
279*67e74705SXin Li       if (!BaseClassDecl->hasTrivialCopyConstructor())
280*67e74705SXin Li         data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
281*67e74705SXin Li       // If the base class doesn't have a simple move constructor, we'll eagerly
282*67e74705SXin Li       // declare it and perform overload resolution to determine which function
283*67e74705SXin Li       // it actually calls. If it does have a simple move constructor, this
284*67e74705SXin Li       // check is correct.
285*67e74705SXin Li       if (!BaseClassDecl->hasTrivialMoveConstructor())
286*67e74705SXin Li         data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
287*67e74705SXin Li 
288*67e74705SXin Li       // C++0x [class.copy]p27:
289*67e74705SXin Li       //   A copy/move assignment operator for class X is trivial if [...]
290*67e74705SXin Li       //    [...]
291*67e74705SXin Li       //    -- the assignment operator selected to copy/move each direct base
292*67e74705SXin Li       //       class subobject is trivial, and
293*67e74705SXin Li       if (!BaseClassDecl->hasTrivialCopyAssignment())
294*67e74705SXin Li         data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
295*67e74705SXin Li       // If the base class doesn't have a simple move assignment, we'll eagerly
296*67e74705SXin Li       // declare it and perform overload resolution to determine which function
297*67e74705SXin Li       // it actually calls. If it does have a simple move assignment, this
298*67e74705SXin Li       // check is correct.
299*67e74705SXin Li       if (!BaseClassDecl->hasTrivialMoveAssignment())
300*67e74705SXin Li         data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
301*67e74705SXin Li 
302*67e74705SXin Li       // C++11 [class.ctor]p6:
303*67e74705SXin Li       //   If that user-written default constructor would satisfy the
304*67e74705SXin Li       //   requirements of a constexpr constructor, the implicitly-defined
305*67e74705SXin Li       //   default constructor is constexpr.
306*67e74705SXin Li       if (!BaseClassDecl->hasConstexprDefaultConstructor())
307*67e74705SXin Li         data().DefaultedDefaultConstructorIsConstexpr = false;
308*67e74705SXin Li     }
309*67e74705SXin Li 
310*67e74705SXin Li     // C++ [class.ctor]p3:
311*67e74705SXin Li     //   A destructor is trivial if all the direct base classes of its class
312*67e74705SXin Li     //   have trivial destructors.
313*67e74705SXin Li     if (!BaseClassDecl->hasTrivialDestructor())
314*67e74705SXin Li       data().HasTrivialSpecialMembers &= ~SMF_Destructor;
315*67e74705SXin Li 
316*67e74705SXin Li     if (!BaseClassDecl->hasIrrelevantDestructor())
317*67e74705SXin Li       data().HasIrrelevantDestructor = false;
318*67e74705SXin Li 
319*67e74705SXin Li     // C++11 [class.copy]p18:
320*67e74705SXin Li     //   The implicitly-declared copy assignment oeprator for a class X will
321*67e74705SXin Li     //   have the form 'X& X::operator=(const X&)' if each direct base class B
322*67e74705SXin Li     //   of X has a copy assignment operator whose parameter is of type 'const
323*67e74705SXin Li     //   B&', 'const volatile B&', or 'B' [...]
324*67e74705SXin Li     if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
325*67e74705SXin Li       data().ImplicitCopyAssignmentHasConstParam = false;
326*67e74705SXin Li 
327*67e74705SXin Li     // C++11 [class.copy]p8:
328*67e74705SXin Li     //   The implicitly-declared copy constructor for a class X will have
329*67e74705SXin Li     //   the form 'X::X(const X&)' if each direct [...] base class B of X
330*67e74705SXin Li     //   has a copy constructor whose first parameter is of type
331*67e74705SXin Li     //   'const B&' or 'const volatile B&' [...]
332*67e74705SXin Li     if (!BaseClassDecl->hasCopyConstructorWithConstParam())
333*67e74705SXin Li       data().ImplicitCopyConstructorHasConstParam = false;
334*67e74705SXin Li 
335*67e74705SXin Li     // A class has an Objective-C object member if... or any of its bases
336*67e74705SXin Li     // has an Objective-C object member.
337*67e74705SXin Li     if (BaseClassDecl->hasObjectMember())
338*67e74705SXin Li       setHasObjectMember(true);
339*67e74705SXin Li 
340*67e74705SXin Li     if (BaseClassDecl->hasVolatileMember())
341*67e74705SXin Li       setHasVolatileMember(true);
342*67e74705SXin Li 
343*67e74705SXin Li     // Keep track of the presence of mutable fields.
344*67e74705SXin Li     if (BaseClassDecl->hasMutableFields())
345*67e74705SXin Li       data().HasMutableFields = true;
346*67e74705SXin Li 
347*67e74705SXin Li     if (BaseClassDecl->hasUninitializedReferenceMember())
348*67e74705SXin Li       data().HasUninitializedReferenceMember = true;
349*67e74705SXin Li 
350*67e74705SXin Li     if (!BaseClassDecl->allowConstDefaultInit())
351*67e74705SXin Li       data().HasUninitializedFields = true;
352*67e74705SXin Li 
353*67e74705SXin Li     addedClassSubobject(BaseClassDecl);
354*67e74705SXin Li   }
355*67e74705SXin Li 
356*67e74705SXin Li   if (VBases.empty()) {
357*67e74705SXin Li     data().IsParsingBaseSpecifiers = false;
358*67e74705SXin Li     return;
359*67e74705SXin Li   }
360*67e74705SXin Li 
361*67e74705SXin Li   // Create base specifier for any direct or indirect virtual bases.
362*67e74705SXin Li   data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
363*67e74705SXin Li   data().NumVBases = VBases.size();
364*67e74705SXin Li   for (int I = 0, E = VBases.size(); I != E; ++I) {
365*67e74705SXin Li     QualType Type = VBases[I]->getType();
366*67e74705SXin Li     if (!Type->isDependentType())
367*67e74705SXin Li       addedClassSubobject(Type->getAsCXXRecordDecl());
368*67e74705SXin Li     data().getVBases()[I] = *VBases[I];
369*67e74705SXin Li   }
370*67e74705SXin Li 
371*67e74705SXin Li   data().IsParsingBaseSpecifiers = false;
372*67e74705SXin Li }
373*67e74705SXin Li 
addedClassSubobject(CXXRecordDecl * Subobj)374*67e74705SXin Li void CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) {
375*67e74705SXin Li   // C++11 [class.copy]p11:
376*67e74705SXin Li   //   A defaulted copy/move constructor for a class X is defined as
377*67e74705SXin Li   //   deleted if X has:
378*67e74705SXin Li   //    -- a direct or virtual base class B that cannot be copied/moved [...]
379*67e74705SXin Li   //    -- a non-static data member of class type M (or array thereof)
380*67e74705SXin Li   //       that cannot be copied or moved [...]
381*67e74705SXin Li   if (!Subobj->hasSimpleMoveConstructor())
382*67e74705SXin Li     data().NeedOverloadResolutionForMoveConstructor = true;
383*67e74705SXin Li 
384*67e74705SXin Li   // C++11 [class.copy]p23:
385*67e74705SXin Li   //   A defaulted copy/move assignment operator for a class X is defined as
386*67e74705SXin Li   //   deleted if X has:
387*67e74705SXin Li   //    -- a direct or virtual base class B that cannot be copied/moved [...]
388*67e74705SXin Li   //    -- a non-static data member of class type M (or array thereof)
389*67e74705SXin Li   //        that cannot be copied or moved [...]
390*67e74705SXin Li   if (!Subobj->hasSimpleMoveAssignment())
391*67e74705SXin Li     data().NeedOverloadResolutionForMoveAssignment = true;
392*67e74705SXin Li 
393*67e74705SXin Li   // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5:
394*67e74705SXin Li   //   A defaulted [ctor or dtor] for a class X is defined as
395*67e74705SXin Li   //   deleted if X has:
396*67e74705SXin Li   //    -- any direct or virtual base class [...] has a type with a destructor
397*67e74705SXin Li   //       that is deleted or inaccessible from the defaulted [ctor or dtor].
398*67e74705SXin Li   //    -- any non-static data member has a type with a destructor
399*67e74705SXin Li   //       that is deleted or inaccessible from the defaulted [ctor or dtor].
400*67e74705SXin Li   if (!Subobj->hasSimpleDestructor()) {
401*67e74705SXin Li     data().NeedOverloadResolutionForMoveConstructor = true;
402*67e74705SXin Li     data().NeedOverloadResolutionForDestructor = true;
403*67e74705SXin Li   }
404*67e74705SXin Li }
405*67e74705SXin Li 
hasAnyDependentBases() const406*67e74705SXin Li bool CXXRecordDecl::hasAnyDependentBases() const {
407*67e74705SXin Li   if (!isDependentContext())
408*67e74705SXin Li     return false;
409*67e74705SXin Li 
410*67e74705SXin Li   return !forallBases([](const CXXRecordDecl *) { return true; });
411*67e74705SXin Li }
412*67e74705SXin Li 
isTriviallyCopyable() const413*67e74705SXin Li bool CXXRecordDecl::isTriviallyCopyable() const {
414*67e74705SXin Li   // C++0x [class]p5:
415*67e74705SXin Li   //   A trivially copyable class is a class that:
416*67e74705SXin Li   //   -- has no non-trivial copy constructors,
417*67e74705SXin Li   if (hasNonTrivialCopyConstructor()) return false;
418*67e74705SXin Li   //   -- has no non-trivial move constructors,
419*67e74705SXin Li   if (hasNonTrivialMoveConstructor()) return false;
420*67e74705SXin Li   //   -- has no non-trivial copy assignment operators,
421*67e74705SXin Li   if (hasNonTrivialCopyAssignment()) return false;
422*67e74705SXin Li   //   -- has no non-trivial move assignment operators, and
423*67e74705SXin Li   if (hasNonTrivialMoveAssignment()) return false;
424*67e74705SXin Li   //   -- has a trivial destructor.
425*67e74705SXin Li   if (!hasTrivialDestructor()) return false;
426*67e74705SXin Li 
427*67e74705SXin Li   return true;
428*67e74705SXin Li }
429*67e74705SXin Li 
markedVirtualFunctionPure()430*67e74705SXin Li void CXXRecordDecl::markedVirtualFunctionPure() {
431*67e74705SXin Li   // C++ [class.abstract]p2:
432*67e74705SXin Li   //   A class is abstract if it has at least one pure virtual function.
433*67e74705SXin Li   data().Abstract = true;
434*67e74705SXin Li }
435*67e74705SXin Li 
addedMember(Decl * D)436*67e74705SXin Li void CXXRecordDecl::addedMember(Decl *D) {
437*67e74705SXin Li   if (!D->isImplicit() &&
438*67e74705SXin Li       !isa<FieldDecl>(D) &&
439*67e74705SXin Li       !isa<IndirectFieldDecl>(D) &&
440*67e74705SXin Li       (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class ||
441*67e74705SXin Li         cast<TagDecl>(D)->getTagKind() == TTK_Interface))
442*67e74705SXin Li     data().HasOnlyCMembers = false;
443*67e74705SXin Li 
444*67e74705SXin Li   // Ignore friends and invalid declarations.
445*67e74705SXin Li   if (D->getFriendObjectKind() || D->isInvalidDecl())
446*67e74705SXin Li     return;
447*67e74705SXin Li 
448*67e74705SXin Li   FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
449*67e74705SXin Li   if (FunTmpl)
450*67e74705SXin Li     D = FunTmpl->getTemplatedDecl();
451*67e74705SXin Li 
452*67e74705SXin Li   // FIXME: Pass NamedDecl* to addedMember?
453*67e74705SXin Li   Decl *DUnderlying = D;
454*67e74705SXin Li   if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
455*67e74705SXin Li     DUnderlying = ND->getUnderlyingDecl();
456*67e74705SXin Li     if (FunctionTemplateDecl *UnderlyingFunTmpl =
457*67e74705SXin Li             dyn_cast<FunctionTemplateDecl>(DUnderlying))
458*67e74705SXin Li       DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
459*67e74705SXin Li   }
460*67e74705SXin Li 
461*67e74705SXin Li   if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
462*67e74705SXin Li     if (Method->isVirtual()) {
463*67e74705SXin Li       // C++ [dcl.init.aggr]p1:
464*67e74705SXin Li       //   An aggregate is an array or a class with [...] no virtual functions.
465*67e74705SXin Li       data().Aggregate = false;
466*67e74705SXin Li 
467*67e74705SXin Li       // C++ [class]p4:
468*67e74705SXin Li       //   A POD-struct is an aggregate class...
469*67e74705SXin Li       data().PlainOldData = false;
470*67e74705SXin Li 
471*67e74705SXin Li       // C++14 [meta.unary.prop]p4:
472*67e74705SXin Li       //   T is a class type [...] with [...] no virtual member functions...
473*67e74705SXin Li       data().Empty = false;
474*67e74705SXin Li 
475*67e74705SXin Li       // C++ [class.virtual]p1:
476*67e74705SXin Li       //   A class that declares or inherits a virtual function is called a
477*67e74705SXin Li       //   polymorphic class.
478*67e74705SXin Li       data().Polymorphic = true;
479*67e74705SXin Li 
480*67e74705SXin Li       // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
481*67e74705SXin Li       //   A [default constructor, copy/move constructor, or copy/move
482*67e74705SXin Li       //   assignment operator for a class X] is trivial [...] if:
483*67e74705SXin Li       //    -- class X has no virtual functions [...]
484*67e74705SXin Li       data().HasTrivialSpecialMembers &= SMF_Destructor;
485*67e74705SXin Li 
486*67e74705SXin Li       // C++0x [class]p7:
487*67e74705SXin Li       //   A standard-layout class is a class that: [...]
488*67e74705SXin Li       //    -- has no virtual functions
489*67e74705SXin Li       data().IsStandardLayout = false;
490*67e74705SXin Li     }
491*67e74705SXin Li   }
492*67e74705SXin Li 
493*67e74705SXin Li   // Notify the listener if an implicit member was added after the definition
494*67e74705SXin Li   // was completed.
495*67e74705SXin Li   if (!isBeingDefined() && D->isImplicit())
496*67e74705SXin Li     if (ASTMutationListener *L = getASTMutationListener())
497*67e74705SXin Li       L->AddedCXXImplicitMember(data().Definition, D);
498*67e74705SXin Li 
499*67e74705SXin Li   // The kind of special member this declaration is, if any.
500*67e74705SXin Li   unsigned SMKind = 0;
501*67e74705SXin Li 
502*67e74705SXin Li   // Handle constructors.
503*67e74705SXin Li   if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
504*67e74705SXin Li     if (!Constructor->isImplicit()) {
505*67e74705SXin Li       // Note that we have a user-declared constructor.
506*67e74705SXin Li       data().UserDeclaredConstructor = true;
507*67e74705SXin Li 
508*67e74705SXin Li       // C++ [class]p4:
509*67e74705SXin Li       //   A POD-struct is an aggregate class [...]
510*67e74705SXin Li       // Since the POD bit is meant to be C++03 POD-ness, clear it even if the
511*67e74705SXin Li       // type is technically an aggregate in C++0x since it wouldn't be in 03.
512*67e74705SXin Li       data().PlainOldData = false;
513*67e74705SXin Li     }
514*67e74705SXin Li 
515*67e74705SXin Li     if (Constructor->isDefaultConstructor()) {
516*67e74705SXin Li       SMKind |= SMF_DefaultConstructor;
517*67e74705SXin Li 
518*67e74705SXin Li       if (Constructor->isUserProvided())
519*67e74705SXin Li         data().UserProvidedDefaultConstructor = true;
520*67e74705SXin Li       if (Constructor->isConstexpr())
521*67e74705SXin Li         data().HasConstexprDefaultConstructor = true;
522*67e74705SXin Li       if (Constructor->isDefaulted())
523*67e74705SXin Li         data().HasDefaultedDefaultConstructor = true;
524*67e74705SXin Li     }
525*67e74705SXin Li 
526*67e74705SXin Li     if (!FunTmpl) {
527*67e74705SXin Li       unsigned Quals;
528*67e74705SXin Li       if (Constructor->isCopyConstructor(Quals)) {
529*67e74705SXin Li         SMKind |= SMF_CopyConstructor;
530*67e74705SXin Li 
531*67e74705SXin Li         if (Quals & Qualifiers::Const)
532*67e74705SXin Li           data().HasDeclaredCopyConstructorWithConstParam = true;
533*67e74705SXin Li       } else if (Constructor->isMoveConstructor())
534*67e74705SXin Li         SMKind |= SMF_MoveConstructor;
535*67e74705SXin Li     }
536*67e74705SXin Li   }
537*67e74705SXin Li 
538*67e74705SXin Li   // Handle constructors, including those inherited from base classes.
539*67e74705SXin Li   if (CXXConstructorDecl *Constructor =
540*67e74705SXin Li           dyn_cast<CXXConstructorDecl>(DUnderlying)) {
541*67e74705SXin Li     // Record if we see any constexpr constructors which are neither copy
542*67e74705SXin Li     // nor move constructors.
543*67e74705SXin Li     // C++1z [basic.types]p10:
544*67e74705SXin Li     //   [...] has at least one constexpr constructor or constructor template
545*67e74705SXin Li     //   (possibly inherited from a base class) that is not a copy or move
546*67e74705SXin Li     //   constructor [...]
547*67e74705SXin Li     if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor())
548*67e74705SXin Li       data().HasConstexprNonCopyMoveConstructor = true;
549*67e74705SXin Li 
550*67e74705SXin Li     // C++ [dcl.init.aggr]p1:
551*67e74705SXin Li     //   An aggregate is an array or a class with no user-declared
552*67e74705SXin Li     //   constructors [...].
553*67e74705SXin Li     // C++11 [dcl.init.aggr]p1:
554*67e74705SXin Li     //   An aggregate is an array or a class with no user-provided
555*67e74705SXin Li     //   constructors [...].
556*67e74705SXin Li     // C++11 [dcl.init.aggr]p1:
557*67e74705SXin Li     //   An aggregate is an array or a class with no user-provided
558*67e74705SXin Li     //   constructors (including those inherited from a base class) [...].
559*67e74705SXin Li     if (getASTContext().getLangOpts().CPlusPlus11
560*67e74705SXin Li             ? Constructor->isUserProvided()
561*67e74705SXin Li             : !Constructor->isImplicit())
562*67e74705SXin Li       data().Aggregate = false;
563*67e74705SXin Li   }
564*67e74705SXin Li 
565*67e74705SXin Li   // Handle destructors.
566*67e74705SXin Li   if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) {
567*67e74705SXin Li     SMKind |= SMF_Destructor;
568*67e74705SXin Li 
569*67e74705SXin Li     if (DD->isUserProvided())
570*67e74705SXin Li       data().HasIrrelevantDestructor = false;
571*67e74705SXin Li     // If the destructor is explicitly defaulted and not trivial or not public
572*67e74705SXin Li     // or if the destructor is deleted, we clear HasIrrelevantDestructor in
573*67e74705SXin Li     // finishedDefaultedOrDeletedMember.
574*67e74705SXin Li 
575*67e74705SXin Li     // C++11 [class.dtor]p5:
576*67e74705SXin Li     //   A destructor is trivial if [...] the destructor is not virtual.
577*67e74705SXin Li     if (DD->isVirtual())
578*67e74705SXin Li       data().HasTrivialSpecialMembers &= ~SMF_Destructor;
579*67e74705SXin Li   }
580*67e74705SXin Li 
581*67e74705SXin Li   // Handle member functions.
582*67e74705SXin Li   if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
583*67e74705SXin Li     if (Method->isCopyAssignmentOperator()) {
584*67e74705SXin Li       SMKind |= SMF_CopyAssignment;
585*67e74705SXin Li 
586*67e74705SXin Li       const ReferenceType *ParamTy =
587*67e74705SXin Li         Method->getParamDecl(0)->getType()->getAs<ReferenceType>();
588*67e74705SXin Li       if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
589*67e74705SXin Li         data().HasDeclaredCopyAssignmentWithConstParam = true;
590*67e74705SXin Li     }
591*67e74705SXin Li 
592*67e74705SXin Li     if (Method->isMoveAssignmentOperator())
593*67e74705SXin Li       SMKind |= SMF_MoveAssignment;
594*67e74705SXin Li 
595*67e74705SXin Li     // Keep the list of conversion functions up-to-date.
596*67e74705SXin Li     if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
597*67e74705SXin Li       // FIXME: We use the 'unsafe' accessor for the access specifier here,
598*67e74705SXin Li       // because Sema may not have set it yet. That's really just a misdesign
599*67e74705SXin Li       // in Sema. However, LLDB *will* have set the access specifier correctly,
600*67e74705SXin Li       // and adds declarations after the class is technically completed,
601*67e74705SXin Li       // so completeDefinition()'s overriding of the access specifiers doesn't
602*67e74705SXin Li       // work.
603*67e74705SXin Li       AccessSpecifier AS = Conversion->getAccessUnsafe();
604*67e74705SXin Li 
605*67e74705SXin Li       if (Conversion->getPrimaryTemplate()) {
606*67e74705SXin Li         // We don't record specializations.
607*67e74705SXin Li       } else {
608*67e74705SXin Li         ASTContext &Ctx = getASTContext();
609*67e74705SXin Li         ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx);
610*67e74705SXin Li         NamedDecl *Primary =
611*67e74705SXin Li             FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion);
612*67e74705SXin Li         if (Primary->getPreviousDecl())
613*67e74705SXin Li           Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()),
614*67e74705SXin Li                               Primary, AS);
615*67e74705SXin Li         else
616*67e74705SXin Li           Conversions.addDecl(Ctx, Primary, AS);
617*67e74705SXin Li       }
618*67e74705SXin Li     }
619*67e74705SXin Li 
620*67e74705SXin Li     if (SMKind) {
621*67e74705SXin Li       // If this is the first declaration of a special member, we no longer have
622*67e74705SXin Li       // an implicit trivial special member.
623*67e74705SXin Li       data().HasTrivialSpecialMembers &=
624*67e74705SXin Li         data().DeclaredSpecialMembers | ~SMKind;
625*67e74705SXin Li 
626*67e74705SXin Li       if (!Method->isImplicit() && !Method->isUserProvided()) {
627*67e74705SXin Li         // This method is user-declared but not user-provided. We can't work out
628*67e74705SXin Li         // whether it's trivial yet (not until we get to the end of the class).
629*67e74705SXin Li         // We'll handle this method in finishedDefaultedOrDeletedMember.
630*67e74705SXin Li       } else if (Method->isTrivial())
631*67e74705SXin Li         data().HasTrivialSpecialMembers |= SMKind;
632*67e74705SXin Li       else
633*67e74705SXin Li         data().DeclaredNonTrivialSpecialMembers |= SMKind;
634*67e74705SXin Li 
635*67e74705SXin Li       // Note when we have declared a declared special member, and suppress the
636*67e74705SXin Li       // implicit declaration of this special member.
637*67e74705SXin Li       data().DeclaredSpecialMembers |= SMKind;
638*67e74705SXin Li 
639*67e74705SXin Li       if (!Method->isImplicit()) {
640*67e74705SXin Li         data().UserDeclaredSpecialMembers |= SMKind;
641*67e74705SXin Li 
642*67e74705SXin Li         // C++03 [class]p4:
643*67e74705SXin Li         //   A POD-struct is an aggregate class that has [...] no user-defined
644*67e74705SXin Li         //   copy assignment operator and no user-defined destructor.
645*67e74705SXin Li         //
646*67e74705SXin Li         // Since the POD bit is meant to be C++03 POD-ness, and in C++03,
647*67e74705SXin Li         // aggregates could not have any constructors, clear it even for an
648*67e74705SXin Li         // explicitly defaulted or deleted constructor.
649*67e74705SXin Li         // type is technically an aggregate in C++0x since it wouldn't be in 03.
650*67e74705SXin Li         //
651*67e74705SXin Li         // Also, a user-declared move assignment operator makes a class non-POD.
652*67e74705SXin Li         // This is an extension in C++03.
653*67e74705SXin Li         data().PlainOldData = false;
654*67e74705SXin Li       }
655*67e74705SXin Li     }
656*67e74705SXin Li 
657*67e74705SXin Li     return;
658*67e74705SXin Li   }
659*67e74705SXin Li 
660*67e74705SXin Li   // Handle non-static data members.
661*67e74705SXin Li   if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) {
662*67e74705SXin Li     // C++ [class.bit]p2:
663*67e74705SXin Li     //   A declaration for a bit-field that omits the identifier declares an
664*67e74705SXin Li     //   unnamed bit-field. Unnamed bit-fields are not members and cannot be
665*67e74705SXin Li     //   initialized.
666*67e74705SXin Li     if (Field->isUnnamedBitfield())
667*67e74705SXin Li       return;
668*67e74705SXin Li 
669*67e74705SXin Li     // C++ [dcl.init.aggr]p1:
670*67e74705SXin Li     //   An aggregate is an array or a class (clause 9) with [...] no
671*67e74705SXin Li     //   private or protected non-static data members (clause 11).
672*67e74705SXin Li     //
673*67e74705SXin Li     // A POD must be an aggregate.
674*67e74705SXin Li     if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
675*67e74705SXin Li       data().Aggregate = false;
676*67e74705SXin Li       data().PlainOldData = false;
677*67e74705SXin Li     }
678*67e74705SXin Li 
679*67e74705SXin Li     // C++0x [class]p7:
680*67e74705SXin Li     //   A standard-layout class is a class that:
681*67e74705SXin Li     //    [...]
682*67e74705SXin Li     //    -- has the same access control for all non-static data members,
683*67e74705SXin Li     switch (D->getAccess()) {
684*67e74705SXin Li     case AS_private:    data().HasPrivateFields = true;   break;
685*67e74705SXin Li     case AS_protected:  data().HasProtectedFields = true; break;
686*67e74705SXin Li     case AS_public:     data().HasPublicFields = true;    break;
687*67e74705SXin Li     case AS_none:       llvm_unreachable("Invalid access specifier");
688*67e74705SXin Li     };
689*67e74705SXin Li     if ((data().HasPrivateFields + data().HasProtectedFields +
690*67e74705SXin Li          data().HasPublicFields) > 1)
691*67e74705SXin Li       data().IsStandardLayout = false;
692*67e74705SXin Li 
693*67e74705SXin Li     // Keep track of the presence of mutable fields.
694*67e74705SXin Li     if (Field->isMutable())
695*67e74705SXin Li       data().HasMutableFields = true;
696*67e74705SXin Li 
697*67e74705SXin Li     // C++11 [class.union]p8, DR1460:
698*67e74705SXin Li     //   If X is a union, a non-static data member of X that is not an anonymous
699*67e74705SXin Li     //   union is a variant member of X.
700*67e74705SXin Li     if (isUnion() && !Field->isAnonymousStructOrUnion())
701*67e74705SXin Li       data().HasVariantMembers = true;
702*67e74705SXin Li 
703*67e74705SXin Li     // C++0x [class]p9:
704*67e74705SXin Li     //   A POD struct is a class that is both a trivial class and a
705*67e74705SXin Li     //   standard-layout class, and has no non-static data members of type
706*67e74705SXin Li     //   non-POD struct, non-POD union (or array of such types).
707*67e74705SXin Li     //
708*67e74705SXin Li     // Automatic Reference Counting: the presence of a member of Objective-C pointer type
709*67e74705SXin Li     // that does not explicitly have no lifetime makes the class a non-POD.
710*67e74705SXin Li     ASTContext &Context = getASTContext();
711*67e74705SXin Li     QualType T = Context.getBaseElementType(Field->getType());
712*67e74705SXin Li     if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
713*67e74705SXin Li       if (!Context.getLangOpts().ObjCAutoRefCount) {
714*67e74705SXin Li         setHasObjectMember(true);
715*67e74705SXin Li       } else if (T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) {
716*67e74705SXin Li         // Objective-C Automatic Reference Counting:
717*67e74705SXin Li         //   If a class has a non-static data member of Objective-C pointer
718*67e74705SXin Li         //   type (or array thereof), it is a non-POD type and its
719*67e74705SXin Li         //   default constructor (if any), copy constructor, move constructor,
720*67e74705SXin Li         //   copy assignment operator, move assignment operator, and destructor are
721*67e74705SXin Li         //   non-trivial.
722*67e74705SXin Li         setHasObjectMember(true);
723*67e74705SXin Li         struct DefinitionData &Data = data();
724*67e74705SXin Li         Data.PlainOldData = false;
725*67e74705SXin Li         Data.HasTrivialSpecialMembers = 0;
726*67e74705SXin Li         Data.HasIrrelevantDestructor = false;
727*67e74705SXin Li       }
728*67e74705SXin Li     } else if (!T.isCXX98PODType(Context))
729*67e74705SXin Li       data().PlainOldData = false;
730*67e74705SXin Li 
731*67e74705SXin Li     if (T->isReferenceType()) {
732*67e74705SXin Li       if (!Field->hasInClassInitializer())
733*67e74705SXin Li         data().HasUninitializedReferenceMember = true;
734*67e74705SXin Li 
735*67e74705SXin Li       // C++0x [class]p7:
736*67e74705SXin Li       //   A standard-layout class is a class that:
737*67e74705SXin Li       //    -- has no non-static data members of type [...] reference,
738*67e74705SXin Li       data().IsStandardLayout = false;
739*67e74705SXin Li     }
740*67e74705SXin Li 
741*67e74705SXin Li     if (!Field->hasInClassInitializer() && !Field->isMutable()) {
742*67e74705SXin Li       if (CXXRecordDecl *FieldType = Field->getType()->getAsCXXRecordDecl()) {
743*67e74705SXin Li         if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
744*67e74705SXin Li           data().HasUninitializedFields = true;
745*67e74705SXin Li       } else {
746*67e74705SXin Li         data().HasUninitializedFields = true;
747*67e74705SXin Li       }
748*67e74705SXin Li     }
749*67e74705SXin Li 
750*67e74705SXin Li     // Record if this field is the first non-literal or volatile field or base.
751*67e74705SXin Li     if (!T->isLiteralType(Context) || T.isVolatileQualified())
752*67e74705SXin Li       data().HasNonLiteralTypeFieldsOrBases = true;
753*67e74705SXin Li 
754*67e74705SXin Li     if (Field->hasInClassInitializer() ||
755*67e74705SXin Li         (Field->isAnonymousStructOrUnion() &&
756*67e74705SXin Li          Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
757*67e74705SXin Li       data().HasInClassInitializer = true;
758*67e74705SXin Li 
759*67e74705SXin Li       // C++11 [class]p5:
760*67e74705SXin Li       //   A default constructor is trivial if [...] no non-static data member
761*67e74705SXin Li       //   of its class has a brace-or-equal-initializer.
762*67e74705SXin Li       data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
763*67e74705SXin Li 
764*67e74705SXin Li       // C++11 [dcl.init.aggr]p1:
765*67e74705SXin Li       //   An aggregate is a [...] class with [...] no
766*67e74705SXin Li       //   brace-or-equal-initializers for non-static data members.
767*67e74705SXin Li       //
768*67e74705SXin Li       // This rule was removed in C++14.
769*67e74705SXin Li       if (!getASTContext().getLangOpts().CPlusPlus14)
770*67e74705SXin Li         data().Aggregate = false;
771*67e74705SXin Li 
772*67e74705SXin Li       // C++11 [class]p10:
773*67e74705SXin Li       //   A POD struct is [...] a trivial class.
774*67e74705SXin Li       data().PlainOldData = false;
775*67e74705SXin Li     }
776*67e74705SXin Li 
777*67e74705SXin Li     // C++11 [class.copy]p23:
778*67e74705SXin Li     //   A defaulted copy/move assignment operator for a class X is defined
779*67e74705SXin Li     //   as deleted if X has:
780*67e74705SXin Li     //    -- a non-static data member of reference type
781*67e74705SXin Li     if (T->isReferenceType())
782*67e74705SXin Li       data().DefaultedMoveAssignmentIsDeleted = true;
783*67e74705SXin Li 
784*67e74705SXin Li     if (const RecordType *RecordTy = T->getAs<RecordType>()) {
785*67e74705SXin Li       CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
786*67e74705SXin Li       if (FieldRec->getDefinition()) {
787*67e74705SXin Li         addedClassSubobject(FieldRec);
788*67e74705SXin Li 
789*67e74705SXin Li         // We may need to perform overload resolution to determine whether a
790*67e74705SXin Li         // field can be moved if it's const or volatile qualified.
791*67e74705SXin Li         if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) {
792*67e74705SXin Li           data().NeedOverloadResolutionForMoveConstructor = true;
793*67e74705SXin Li           data().NeedOverloadResolutionForMoveAssignment = true;
794*67e74705SXin Li         }
795*67e74705SXin Li 
796*67e74705SXin Li         // C++11 [class.ctor]p5, C++11 [class.copy]p11:
797*67e74705SXin Li         //   A defaulted [special member] for a class X is defined as
798*67e74705SXin Li         //   deleted if:
799*67e74705SXin Li         //    -- X is a union-like class that has a variant member with a
800*67e74705SXin Li         //       non-trivial [corresponding special member]
801*67e74705SXin Li         if (isUnion()) {
802*67e74705SXin Li           if (FieldRec->hasNonTrivialMoveConstructor())
803*67e74705SXin Li             data().DefaultedMoveConstructorIsDeleted = true;
804*67e74705SXin Li           if (FieldRec->hasNonTrivialMoveAssignment())
805*67e74705SXin Li             data().DefaultedMoveAssignmentIsDeleted = true;
806*67e74705SXin Li           if (FieldRec->hasNonTrivialDestructor())
807*67e74705SXin Li             data().DefaultedDestructorIsDeleted = true;
808*67e74705SXin Li         }
809*67e74705SXin Li 
810*67e74705SXin Li         // C++0x [class.ctor]p5:
811*67e74705SXin Li         //   A default constructor is trivial [...] if:
812*67e74705SXin Li         //    -- for all the non-static data members of its class that are of
813*67e74705SXin Li         //       class type (or array thereof), each such class has a trivial
814*67e74705SXin Li         //       default constructor.
815*67e74705SXin Li         if (!FieldRec->hasTrivialDefaultConstructor())
816*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
817*67e74705SXin Li 
818*67e74705SXin Li         // C++0x [class.copy]p13:
819*67e74705SXin Li         //   A copy/move constructor for class X is trivial if [...]
820*67e74705SXin Li         //    [...]
821*67e74705SXin Li         //    -- for each non-static data member of X that is of class type (or
822*67e74705SXin Li         //       an array thereof), the constructor selected to copy/move that
823*67e74705SXin Li         //       member is trivial;
824*67e74705SXin Li         if (!FieldRec->hasTrivialCopyConstructor())
825*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
826*67e74705SXin Li         // If the field doesn't have a simple move constructor, we'll eagerly
827*67e74705SXin Li         // declare the move constructor for this class and we'll decide whether
828*67e74705SXin Li         // it's trivial then.
829*67e74705SXin Li         if (!FieldRec->hasTrivialMoveConstructor())
830*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
831*67e74705SXin Li 
832*67e74705SXin Li         // C++0x [class.copy]p27:
833*67e74705SXin Li         //   A copy/move assignment operator for class X is trivial if [...]
834*67e74705SXin Li         //    [...]
835*67e74705SXin Li         //    -- for each non-static data member of X that is of class type (or
836*67e74705SXin Li         //       an array thereof), the assignment operator selected to
837*67e74705SXin Li         //       copy/move that member is trivial;
838*67e74705SXin Li         if (!FieldRec->hasTrivialCopyAssignment())
839*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
840*67e74705SXin Li         // If the field doesn't have a simple move assignment, we'll eagerly
841*67e74705SXin Li         // declare the move assignment for this class and we'll decide whether
842*67e74705SXin Li         // it's trivial then.
843*67e74705SXin Li         if (!FieldRec->hasTrivialMoveAssignment())
844*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
845*67e74705SXin Li 
846*67e74705SXin Li         if (!FieldRec->hasTrivialDestructor())
847*67e74705SXin Li           data().HasTrivialSpecialMembers &= ~SMF_Destructor;
848*67e74705SXin Li         if (!FieldRec->hasIrrelevantDestructor())
849*67e74705SXin Li           data().HasIrrelevantDestructor = false;
850*67e74705SXin Li         if (FieldRec->hasObjectMember())
851*67e74705SXin Li           setHasObjectMember(true);
852*67e74705SXin Li         if (FieldRec->hasVolatileMember())
853*67e74705SXin Li           setHasVolatileMember(true);
854*67e74705SXin Li 
855*67e74705SXin Li         // C++0x [class]p7:
856*67e74705SXin Li         //   A standard-layout class is a class that:
857*67e74705SXin Li         //    -- has no non-static data members of type non-standard-layout
858*67e74705SXin Li         //       class (or array of such types) [...]
859*67e74705SXin Li         if (!FieldRec->isStandardLayout())
860*67e74705SXin Li           data().IsStandardLayout = false;
861*67e74705SXin Li 
862*67e74705SXin Li         // C++0x [class]p7:
863*67e74705SXin Li         //   A standard-layout class is a class that:
864*67e74705SXin Li         //    [...]
865*67e74705SXin Li         //    -- has no base classes of the same type as the first non-static
866*67e74705SXin Li         //       data member.
867*67e74705SXin Li         // We don't want to expend bits in the state of the record decl
868*67e74705SXin Li         // tracking whether this is the first non-static data member so we
869*67e74705SXin Li         // cheat a bit and use some of the existing state: the empty bit.
870*67e74705SXin Li         // Virtual bases and virtual methods make a class non-empty, but they
871*67e74705SXin Li         // also make it non-standard-layout so we needn't check here.
872*67e74705SXin Li         // A non-empty base class may leave the class standard-layout, but not
873*67e74705SXin Li         // if we have arrived here, and have at least one non-static data
874*67e74705SXin Li         // member. If IsStandardLayout remains true, then the first non-static
875*67e74705SXin Li         // data member must come through here with Empty still true, and Empty
876*67e74705SXin Li         // will subsequently be set to false below.
877*67e74705SXin Li         if (data().IsStandardLayout && data().Empty) {
878*67e74705SXin Li           for (const auto &BI : bases()) {
879*67e74705SXin Li             if (Context.hasSameUnqualifiedType(BI.getType(), T)) {
880*67e74705SXin Li               data().IsStandardLayout = false;
881*67e74705SXin Li               break;
882*67e74705SXin Li             }
883*67e74705SXin Li           }
884*67e74705SXin Li         }
885*67e74705SXin Li 
886*67e74705SXin Li         // Keep track of the presence of mutable fields.
887*67e74705SXin Li         if (FieldRec->hasMutableFields())
888*67e74705SXin Li           data().HasMutableFields = true;
889*67e74705SXin Li 
890*67e74705SXin Li         // C++11 [class.copy]p13:
891*67e74705SXin Li         //   If the implicitly-defined constructor would satisfy the
892*67e74705SXin Li         //   requirements of a constexpr constructor, the implicitly-defined
893*67e74705SXin Li         //   constructor is constexpr.
894*67e74705SXin Li         // C++11 [dcl.constexpr]p4:
895*67e74705SXin Li         //    -- every constructor involved in initializing non-static data
896*67e74705SXin Li         //       members [...] shall be a constexpr constructor
897*67e74705SXin Li         if (!Field->hasInClassInitializer() &&
898*67e74705SXin Li             !FieldRec->hasConstexprDefaultConstructor() && !isUnion())
899*67e74705SXin Li           // The standard requires any in-class initializer to be a constant
900*67e74705SXin Li           // expression. We consider this to be a defect.
901*67e74705SXin Li           data().DefaultedDefaultConstructorIsConstexpr = false;
902*67e74705SXin Li 
903*67e74705SXin Li         // C++11 [class.copy]p8:
904*67e74705SXin Li         //   The implicitly-declared copy constructor for a class X will have
905*67e74705SXin Li         //   the form 'X::X(const X&)' if [...] for all the non-static data
906*67e74705SXin Li         //   members of X that are of a class type M (or array thereof), each
907*67e74705SXin Li         //   such class type has a copy constructor whose first parameter is
908*67e74705SXin Li         //   of type 'const M&' or 'const volatile M&'.
909*67e74705SXin Li         if (!FieldRec->hasCopyConstructorWithConstParam())
910*67e74705SXin Li           data().ImplicitCopyConstructorHasConstParam = false;
911*67e74705SXin Li 
912*67e74705SXin Li         // C++11 [class.copy]p18:
913*67e74705SXin Li         //   The implicitly-declared copy assignment oeprator for a class X will
914*67e74705SXin Li         //   have the form 'X& X::operator=(const X&)' if [...] for all the
915*67e74705SXin Li         //   non-static data members of X that are of a class type M (or array
916*67e74705SXin Li         //   thereof), each such class type has a copy assignment operator whose
917*67e74705SXin Li         //   parameter is of type 'const M&', 'const volatile M&' or 'M'.
918*67e74705SXin Li         if (!FieldRec->hasCopyAssignmentWithConstParam())
919*67e74705SXin Li           data().ImplicitCopyAssignmentHasConstParam = false;
920*67e74705SXin Li 
921*67e74705SXin Li         if (FieldRec->hasUninitializedReferenceMember() &&
922*67e74705SXin Li             !Field->hasInClassInitializer())
923*67e74705SXin Li           data().HasUninitializedReferenceMember = true;
924*67e74705SXin Li 
925*67e74705SXin Li         // C++11 [class.union]p8, DR1460:
926*67e74705SXin Li         //   a non-static data member of an anonymous union that is a member of
927*67e74705SXin Li         //   X is also a variant member of X.
928*67e74705SXin Li         if (FieldRec->hasVariantMembers() &&
929*67e74705SXin Li             Field->isAnonymousStructOrUnion())
930*67e74705SXin Li           data().HasVariantMembers = true;
931*67e74705SXin Li       }
932*67e74705SXin Li     } else {
933*67e74705SXin Li       // Base element type of field is a non-class type.
934*67e74705SXin Li       if (!T->isLiteralType(Context) ||
935*67e74705SXin Li           (!Field->hasInClassInitializer() && !isUnion()))
936*67e74705SXin Li         data().DefaultedDefaultConstructorIsConstexpr = false;
937*67e74705SXin Li 
938*67e74705SXin Li       // C++11 [class.copy]p23:
939*67e74705SXin Li       //   A defaulted copy/move assignment operator for a class X is defined
940*67e74705SXin Li       //   as deleted if X has:
941*67e74705SXin Li       //    -- a non-static data member of const non-class type (or array
942*67e74705SXin Li       //       thereof)
943*67e74705SXin Li       if (T.isConstQualified())
944*67e74705SXin Li         data().DefaultedMoveAssignmentIsDeleted = true;
945*67e74705SXin Li     }
946*67e74705SXin Li 
947*67e74705SXin Li     // C++0x [class]p7:
948*67e74705SXin Li     //   A standard-layout class is a class that:
949*67e74705SXin Li     //    [...]
950*67e74705SXin Li     //    -- either has no non-static data members in the most derived
951*67e74705SXin Li     //       class and at most one base class with non-static data members,
952*67e74705SXin Li     //       or has no base classes with non-static data members, and
953*67e74705SXin Li     // At this point we know that we have a non-static data member, so the last
954*67e74705SXin Li     // clause holds.
955*67e74705SXin Li     if (!data().HasNoNonEmptyBases)
956*67e74705SXin Li       data().IsStandardLayout = false;
957*67e74705SXin Li 
958*67e74705SXin Li     // C++14 [meta.unary.prop]p4:
959*67e74705SXin Li     //   T is a class type [...] with [...] no non-static data members other
960*67e74705SXin Li     //   than bit-fields of length 0...
961*67e74705SXin Li     if (data().Empty) {
962*67e74705SXin Li       if (!Field->isBitField() ||
963*67e74705SXin Li           (!Field->getBitWidth()->isTypeDependent() &&
964*67e74705SXin Li            !Field->getBitWidth()->isValueDependent() &&
965*67e74705SXin Li            Field->getBitWidthValue(Context) != 0))
966*67e74705SXin Li         data().Empty = false;
967*67e74705SXin Li     }
968*67e74705SXin Li   }
969*67e74705SXin Li 
970*67e74705SXin Li   // Handle using declarations of conversion functions.
971*67e74705SXin Li   if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) {
972*67e74705SXin Li     if (Shadow->getDeclName().getNameKind()
973*67e74705SXin Li           == DeclarationName::CXXConversionFunctionName) {
974*67e74705SXin Li       ASTContext &Ctx = getASTContext();
975*67e74705SXin Li       data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
976*67e74705SXin Li     }
977*67e74705SXin Li   }
978*67e74705SXin Li 
979*67e74705SXin Li   if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
980*67e74705SXin Li     if (Using->getDeclName().getNameKind() ==
981*67e74705SXin Li         DeclarationName::CXXConstructorName)
982*67e74705SXin Li       data().HasInheritedConstructor = true;
983*67e74705SXin Li 
984*67e74705SXin Li     if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
985*67e74705SXin Li       data().HasInheritedAssignment = true;
986*67e74705SXin Li   }
987*67e74705SXin Li }
988*67e74705SXin Li 
finishedDefaultedOrDeletedMember(CXXMethodDecl * D)989*67e74705SXin Li void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) {
990*67e74705SXin Li   assert(!D->isImplicit() && !D->isUserProvided());
991*67e74705SXin Li 
992*67e74705SXin Li   // The kind of special member this declaration is, if any.
993*67e74705SXin Li   unsigned SMKind = 0;
994*67e74705SXin Li 
995*67e74705SXin Li   if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
996*67e74705SXin Li     if (Constructor->isDefaultConstructor()) {
997*67e74705SXin Li       SMKind |= SMF_DefaultConstructor;
998*67e74705SXin Li       if (Constructor->isConstexpr())
999*67e74705SXin Li         data().HasConstexprDefaultConstructor = true;
1000*67e74705SXin Li     }
1001*67e74705SXin Li     if (Constructor->isCopyConstructor())
1002*67e74705SXin Li       SMKind |= SMF_CopyConstructor;
1003*67e74705SXin Li     else if (Constructor->isMoveConstructor())
1004*67e74705SXin Li       SMKind |= SMF_MoveConstructor;
1005*67e74705SXin Li     else if (Constructor->isConstexpr())
1006*67e74705SXin Li       // We may now know that the constructor is constexpr.
1007*67e74705SXin Li       data().HasConstexprNonCopyMoveConstructor = true;
1008*67e74705SXin Li   } else if (isa<CXXDestructorDecl>(D)) {
1009*67e74705SXin Li     SMKind |= SMF_Destructor;
1010*67e74705SXin Li     if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted())
1011*67e74705SXin Li       data().HasIrrelevantDestructor = false;
1012*67e74705SXin Li   } else if (D->isCopyAssignmentOperator())
1013*67e74705SXin Li     SMKind |= SMF_CopyAssignment;
1014*67e74705SXin Li   else if (D->isMoveAssignmentOperator())
1015*67e74705SXin Li     SMKind |= SMF_MoveAssignment;
1016*67e74705SXin Li 
1017*67e74705SXin Li   // Update which trivial / non-trivial special members we have.
1018*67e74705SXin Li   // addedMember will have skipped this step for this member.
1019*67e74705SXin Li   if (D->isTrivial())
1020*67e74705SXin Li     data().HasTrivialSpecialMembers |= SMKind;
1021*67e74705SXin Li   else
1022*67e74705SXin Li     data().DeclaredNonTrivialSpecialMembers |= SMKind;
1023*67e74705SXin Li }
1024*67e74705SXin Li 
isCLike() const1025*67e74705SXin Li bool CXXRecordDecl::isCLike() const {
1026*67e74705SXin Li   if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface ||
1027*67e74705SXin Li       !TemplateOrInstantiation.isNull())
1028*67e74705SXin Li     return false;
1029*67e74705SXin Li   if (!hasDefinition())
1030*67e74705SXin Li     return true;
1031*67e74705SXin Li 
1032*67e74705SXin Li   return isPOD() && data().HasOnlyCMembers;
1033*67e74705SXin Li }
1034*67e74705SXin Li 
isGenericLambda() const1035*67e74705SXin Li bool CXXRecordDecl::isGenericLambda() const {
1036*67e74705SXin Li   if (!isLambda()) return false;
1037*67e74705SXin Li   return getLambdaData().IsGenericLambda;
1038*67e74705SXin Li }
1039*67e74705SXin Li 
getLambdaCallOperator() const1040*67e74705SXin Li CXXMethodDecl* CXXRecordDecl::getLambdaCallOperator() const {
1041*67e74705SXin Li   if (!isLambda()) return nullptr;
1042*67e74705SXin Li   DeclarationName Name =
1043*67e74705SXin Li     getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
1044*67e74705SXin Li   DeclContext::lookup_result Calls = lookup(Name);
1045*67e74705SXin Li 
1046*67e74705SXin Li   assert(!Calls.empty() && "Missing lambda call operator!");
1047*67e74705SXin Li   assert(Calls.size() == 1 && "More than one lambda call operator!");
1048*67e74705SXin Li 
1049*67e74705SXin Li   NamedDecl *CallOp = Calls.front();
1050*67e74705SXin Li   if (FunctionTemplateDecl *CallOpTmpl =
1051*67e74705SXin Li                     dyn_cast<FunctionTemplateDecl>(CallOp))
1052*67e74705SXin Li     return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1053*67e74705SXin Li 
1054*67e74705SXin Li   return cast<CXXMethodDecl>(CallOp);
1055*67e74705SXin Li }
1056*67e74705SXin Li 
getLambdaStaticInvoker() const1057*67e74705SXin Li CXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const {
1058*67e74705SXin Li   if (!isLambda()) return nullptr;
1059*67e74705SXin Li   DeclarationName Name =
1060*67e74705SXin Li     &getASTContext().Idents.get(getLambdaStaticInvokerName());
1061*67e74705SXin Li   DeclContext::lookup_result Invoker = lookup(Name);
1062*67e74705SXin Li   if (Invoker.empty()) return nullptr;
1063*67e74705SXin Li   assert(Invoker.size() == 1 && "More than one static invoker operator!");
1064*67e74705SXin Li   NamedDecl *InvokerFun = Invoker.front();
1065*67e74705SXin Li   if (FunctionTemplateDecl *InvokerTemplate =
1066*67e74705SXin Li                   dyn_cast<FunctionTemplateDecl>(InvokerFun))
1067*67e74705SXin Li     return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1068*67e74705SXin Li 
1069*67e74705SXin Li   return cast<CXXMethodDecl>(InvokerFun);
1070*67e74705SXin Li }
1071*67e74705SXin Li 
getCaptureFields(llvm::DenseMap<const VarDecl *,FieldDecl * > & Captures,FieldDecl * & ThisCapture) const1072*67e74705SXin Li void CXXRecordDecl::getCaptureFields(
1073*67e74705SXin Li        llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
1074*67e74705SXin Li        FieldDecl *&ThisCapture) const {
1075*67e74705SXin Li   Captures.clear();
1076*67e74705SXin Li   ThisCapture = nullptr;
1077*67e74705SXin Li 
1078*67e74705SXin Li   LambdaDefinitionData &Lambda = getLambdaData();
1079*67e74705SXin Li   RecordDecl::field_iterator Field = field_begin();
1080*67e74705SXin Li   for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures;
1081*67e74705SXin Li        C != CEnd; ++C, ++Field) {
1082*67e74705SXin Li     if (C->capturesThis())
1083*67e74705SXin Li       ThisCapture = *Field;
1084*67e74705SXin Li     else if (C->capturesVariable())
1085*67e74705SXin Li       Captures[C->getCapturedVar()] = *Field;
1086*67e74705SXin Li   }
1087*67e74705SXin Li   assert(Field == field_end());
1088*67e74705SXin Li }
1089*67e74705SXin Li 
1090*67e74705SXin Li TemplateParameterList *
getGenericLambdaTemplateParameterList() const1091*67e74705SXin Li CXXRecordDecl::getGenericLambdaTemplateParameterList() const {
1092*67e74705SXin Li   if (!isLambda()) return nullptr;
1093*67e74705SXin Li   CXXMethodDecl *CallOp = getLambdaCallOperator();
1094*67e74705SXin Li   if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate())
1095*67e74705SXin Li     return Tmpl->getTemplateParameters();
1096*67e74705SXin Li   return nullptr;
1097*67e74705SXin Li }
1098*67e74705SXin Li 
GetConversionType(ASTContext & Context,NamedDecl * Conv)1099*67e74705SXin Li static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
1100*67e74705SXin Li   QualType T =
1101*67e74705SXin Li       cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1102*67e74705SXin Li           ->getConversionType();
1103*67e74705SXin Li   return Context.getCanonicalType(T);
1104*67e74705SXin Li }
1105*67e74705SXin Li 
1106*67e74705SXin Li /// Collect the visible conversions of a base class.
1107*67e74705SXin Li ///
1108*67e74705SXin Li /// \param Record a base class of the class we're considering
1109*67e74705SXin Li /// \param InVirtual whether this base class is a virtual base (or a base
1110*67e74705SXin Li ///   of a virtual base)
1111*67e74705SXin Li /// \param Access the access along the inheritance path to this base
1112*67e74705SXin Li /// \param ParentHiddenTypes the conversions provided by the inheritors
1113*67e74705SXin Li ///   of this base
1114*67e74705SXin Li /// \param Output the set to which to add conversions from non-virtual bases
1115*67e74705SXin Li /// \param VOutput the set to which to add conversions from virtual bases
1116*67e74705SXin Li /// \param HiddenVBaseCs the set of conversions which were hidden in a
1117*67e74705SXin Li ///   virtual base along some inheritance path
CollectVisibleConversions(ASTContext & Context,CXXRecordDecl * Record,bool InVirtual,AccessSpecifier Access,const llvm::SmallPtrSet<CanQualType,8> & ParentHiddenTypes,ASTUnresolvedSet & Output,UnresolvedSetImpl & VOutput,llvm::SmallPtrSet<NamedDecl *,8> & HiddenVBaseCs)1118*67e74705SXin Li static void CollectVisibleConversions(ASTContext &Context,
1119*67e74705SXin Li                                       CXXRecordDecl *Record,
1120*67e74705SXin Li                                       bool InVirtual,
1121*67e74705SXin Li                                       AccessSpecifier Access,
1122*67e74705SXin Li                   const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1123*67e74705SXin Li                                       ASTUnresolvedSet &Output,
1124*67e74705SXin Li                                       UnresolvedSetImpl &VOutput,
1125*67e74705SXin Li                            llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) {
1126*67e74705SXin Li   // The set of types which have conversions in this class or its
1127*67e74705SXin Li   // subclasses.  As an optimization, we don't copy the derived set
1128*67e74705SXin Li   // unless it might change.
1129*67e74705SXin Li   const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1130*67e74705SXin Li   llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1131*67e74705SXin Li 
1132*67e74705SXin Li   // Collect the direct conversions and figure out which conversions
1133*67e74705SXin Li   // will be hidden in the subclasses.
1134*67e74705SXin Li   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1135*67e74705SXin Li   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1136*67e74705SXin Li   if (ConvI != ConvE) {
1137*67e74705SXin Li     HiddenTypesBuffer = ParentHiddenTypes;
1138*67e74705SXin Li     HiddenTypes = &HiddenTypesBuffer;
1139*67e74705SXin Li 
1140*67e74705SXin Li     for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
1141*67e74705SXin Li       CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1142*67e74705SXin Li       bool Hidden = ParentHiddenTypes.count(ConvType);
1143*67e74705SXin Li       if (!Hidden)
1144*67e74705SXin Li         HiddenTypesBuffer.insert(ConvType);
1145*67e74705SXin Li 
1146*67e74705SXin Li       // If this conversion is hidden and we're in a virtual base,
1147*67e74705SXin Li       // remember that it's hidden along some inheritance path.
1148*67e74705SXin Li       if (Hidden && InVirtual)
1149*67e74705SXin Li         HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1150*67e74705SXin Li 
1151*67e74705SXin Li       // If this conversion isn't hidden, add it to the appropriate output.
1152*67e74705SXin Li       else if (!Hidden) {
1153*67e74705SXin Li         AccessSpecifier IAccess
1154*67e74705SXin Li           = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1155*67e74705SXin Li 
1156*67e74705SXin Li         if (InVirtual)
1157*67e74705SXin Li           VOutput.addDecl(I.getDecl(), IAccess);
1158*67e74705SXin Li         else
1159*67e74705SXin Li           Output.addDecl(Context, I.getDecl(), IAccess);
1160*67e74705SXin Li       }
1161*67e74705SXin Li     }
1162*67e74705SXin Li   }
1163*67e74705SXin Li 
1164*67e74705SXin Li   // Collect information recursively from any base classes.
1165*67e74705SXin Li   for (const auto &I : Record->bases()) {
1166*67e74705SXin Li     const RecordType *RT = I.getType()->getAs<RecordType>();
1167*67e74705SXin Li     if (!RT) continue;
1168*67e74705SXin Li 
1169*67e74705SXin Li     AccessSpecifier BaseAccess
1170*67e74705SXin Li       = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1171*67e74705SXin Li     bool BaseInVirtual = InVirtual || I.isVirtual();
1172*67e74705SXin Li 
1173*67e74705SXin Li     CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1174*67e74705SXin Li     CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1175*67e74705SXin Li                               *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1176*67e74705SXin Li   }
1177*67e74705SXin Li }
1178*67e74705SXin Li 
1179*67e74705SXin Li /// Collect the visible conversions of a class.
1180*67e74705SXin Li ///
1181*67e74705SXin Li /// This would be extremely straightforward if it weren't for virtual
1182*67e74705SXin Li /// bases.  It might be worth special-casing that, really.
CollectVisibleConversions(ASTContext & Context,CXXRecordDecl * Record,ASTUnresolvedSet & Output)1183*67e74705SXin Li static void CollectVisibleConversions(ASTContext &Context,
1184*67e74705SXin Li                                       CXXRecordDecl *Record,
1185*67e74705SXin Li                                       ASTUnresolvedSet &Output) {
1186*67e74705SXin Li   // The collection of all conversions in virtual bases that we've
1187*67e74705SXin Li   // found.  These will be added to the output as long as they don't
1188*67e74705SXin Li   // appear in the hidden-conversions set.
1189*67e74705SXin Li   UnresolvedSet<8> VBaseCs;
1190*67e74705SXin Li 
1191*67e74705SXin Li   // The set of conversions in virtual bases that we've determined to
1192*67e74705SXin Li   // be hidden.
1193*67e74705SXin Li   llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1194*67e74705SXin Li 
1195*67e74705SXin Li   // The set of types hidden by classes derived from this one.
1196*67e74705SXin Li   llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1197*67e74705SXin Li 
1198*67e74705SXin Li   // Go ahead and collect the direct conversions and add them to the
1199*67e74705SXin Li   // hidden-types set.
1200*67e74705SXin Li   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1201*67e74705SXin Li   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1202*67e74705SXin Li   Output.append(Context, ConvI, ConvE);
1203*67e74705SXin Li   for (; ConvI != ConvE; ++ConvI)
1204*67e74705SXin Li     HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
1205*67e74705SXin Li 
1206*67e74705SXin Li   // Recursively collect conversions from base classes.
1207*67e74705SXin Li   for (const auto &I : Record->bases()) {
1208*67e74705SXin Li     const RecordType *RT = I.getType()->getAs<RecordType>();
1209*67e74705SXin Li     if (!RT) continue;
1210*67e74705SXin Li 
1211*67e74705SXin Li     CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1212*67e74705SXin Li                               I.isVirtual(), I.getAccessSpecifier(),
1213*67e74705SXin Li                               HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1214*67e74705SXin Li   }
1215*67e74705SXin Li 
1216*67e74705SXin Li   // Add any unhidden conversions provided by virtual bases.
1217*67e74705SXin Li   for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1218*67e74705SXin Li          I != E; ++I) {
1219*67e74705SXin Li     if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1220*67e74705SXin Li       Output.addDecl(Context, I.getDecl(), I.getAccess());
1221*67e74705SXin Li   }
1222*67e74705SXin Li }
1223*67e74705SXin Li 
1224*67e74705SXin Li /// getVisibleConversionFunctions - get all conversion functions visible
1225*67e74705SXin Li /// in current class; including conversion function templates.
1226*67e74705SXin Li llvm::iterator_range<CXXRecordDecl::conversion_iterator>
getVisibleConversionFunctions()1227*67e74705SXin Li CXXRecordDecl::getVisibleConversionFunctions() {
1228*67e74705SXin Li   ASTContext &Ctx = getASTContext();
1229*67e74705SXin Li 
1230*67e74705SXin Li   ASTUnresolvedSet *Set;
1231*67e74705SXin Li   if (bases_begin() == bases_end()) {
1232*67e74705SXin Li     // If root class, all conversions are visible.
1233*67e74705SXin Li     Set = &data().Conversions.get(Ctx);
1234*67e74705SXin Li   } else {
1235*67e74705SXin Li     Set = &data().VisibleConversions.get(Ctx);
1236*67e74705SXin Li     // If visible conversion list is not evaluated, evaluate it.
1237*67e74705SXin Li     if (!data().ComputedVisibleConversions) {
1238*67e74705SXin Li       CollectVisibleConversions(Ctx, this, *Set);
1239*67e74705SXin Li       data().ComputedVisibleConversions = true;
1240*67e74705SXin Li     }
1241*67e74705SXin Li   }
1242*67e74705SXin Li   return llvm::make_range(Set->begin(), Set->end());
1243*67e74705SXin Li }
1244*67e74705SXin Li 
removeConversion(const NamedDecl * ConvDecl)1245*67e74705SXin Li void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1246*67e74705SXin Li   // This operation is O(N) but extremely rare.  Sema only uses it to
1247*67e74705SXin Li   // remove UsingShadowDecls in a class that were followed by a direct
1248*67e74705SXin Li   // declaration, e.g.:
1249*67e74705SXin Li   //   class A : B {
1250*67e74705SXin Li   //     using B::operator int;
1251*67e74705SXin Li   //     operator int();
1252*67e74705SXin Li   //   };
1253*67e74705SXin Li   // This is uncommon by itself and even more uncommon in conjunction
1254*67e74705SXin Li   // with sufficiently large numbers of directly-declared conversions
1255*67e74705SXin Li   // that asymptotic behavior matters.
1256*67e74705SXin Li 
1257*67e74705SXin Li   ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
1258*67e74705SXin Li   for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1259*67e74705SXin Li     if (Convs[I].getDecl() == ConvDecl) {
1260*67e74705SXin Li       Convs.erase(I);
1261*67e74705SXin Li       assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end()
1262*67e74705SXin Li              && "conversion was found multiple times in unresolved set");
1263*67e74705SXin Li       return;
1264*67e74705SXin Li     }
1265*67e74705SXin Li   }
1266*67e74705SXin Li 
1267*67e74705SXin Li   llvm_unreachable("conversion not found in set!");
1268*67e74705SXin Li }
1269*67e74705SXin Li 
getInstantiatedFromMemberClass() const1270*67e74705SXin Li CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1271*67e74705SXin Li   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1272*67e74705SXin Li     return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1273*67e74705SXin Li 
1274*67e74705SXin Li   return nullptr;
1275*67e74705SXin Li }
1276*67e74705SXin Li 
getMemberSpecializationInfo() const1277*67e74705SXin Li MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1278*67e74705SXin Li   return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1279*67e74705SXin Li }
1280*67e74705SXin Li 
1281*67e74705SXin Li void
setInstantiationOfMemberClass(CXXRecordDecl * RD,TemplateSpecializationKind TSK)1282*67e74705SXin Li CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1283*67e74705SXin Li                                              TemplateSpecializationKind TSK) {
1284*67e74705SXin Li   assert(TemplateOrInstantiation.isNull() &&
1285*67e74705SXin Li          "Previous template or instantiation?");
1286*67e74705SXin Li   assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
1287*67e74705SXin Li   TemplateOrInstantiation
1288*67e74705SXin Li     = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1289*67e74705SXin Li }
1290*67e74705SXin Li 
getDescribedClassTemplate() const1291*67e74705SXin Li ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1292*67e74705SXin Li   return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1293*67e74705SXin Li }
1294*67e74705SXin Li 
setDescribedClassTemplate(ClassTemplateDecl * Template)1295*67e74705SXin Li void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1296*67e74705SXin Li   TemplateOrInstantiation = Template;
1297*67e74705SXin Li }
1298*67e74705SXin Li 
getTemplateSpecializationKind() const1299*67e74705SXin Li TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1300*67e74705SXin Li   if (const ClassTemplateSpecializationDecl *Spec
1301*67e74705SXin Li         = dyn_cast<ClassTemplateSpecializationDecl>(this))
1302*67e74705SXin Li     return Spec->getSpecializationKind();
1303*67e74705SXin Li 
1304*67e74705SXin Li   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1305*67e74705SXin Li     return MSInfo->getTemplateSpecializationKind();
1306*67e74705SXin Li 
1307*67e74705SXin Li   return TSK_Undeclared;
1308*67e74705SXin Li }
1309*67e74705SXin Li 
1310*67e74705SXin Li void
setTemplateSpecializationKind(TemplateSpecializationKind TSK)1311*67e74705SXin Li CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1312*67e74705SXin Li   if (ClassTemplateSpecializationDecl *Spec
1313*67e74705SXin Li       = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1314*67e74705SXin Li     Spec->setSpecializationKind(TSK);
1315*67e74705SXin Li     return;
1316*67e74705SXin Li   }
1317*67e74705SXin Li 
1318*67e74705SXin Li   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1319*67e74705SXin Li     MSInfo->setTemplateSpecializationKind(TSK);
1320*67e74705SXin Li     return;
1321*67e74705SXin Li   }
1322*67e74705SXin Li 
1323*67e74705SXin Li   llvm_unreachable("Not a class template or member class specialization");
1324*67e74705SXin Li }
1325*67e74705SXin Li 
getTemplateInstantiationPattern() const1326*67e74705SXin Li const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
1327*67e74705SXin Li   // If it's a class template specialization, find the template or partial
1328*67e74705SXin Li   // specialization from which it was instantiated.
1329*67e74705SXin Li   if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1330*67e74705SXin Li     auto From = TD->getInstantiatedFrom();
1331*67e74705SXin Li     if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1332*67e74705SXin Li       while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1333*67e74705SXin Li         if (NewCTD->isMemberSpecialization())
1334*67e74705SXin Li           break;
1335*67e74705SXin Li         CTD = NewCTD;
1336*67e74705SXin Li       }
1337*67e74705SXin Li       return CTD->getTemplatedDecl()->getDefinition();
1338*67e74705SXin Li     }
1339*67e74705SXin Li     if (auto *CTPSD =
1340*67e74705SXin Li             From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1341*67e74705SXin Li       while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1342*67e74705SXin Li         if (NewCTPSD->isMemberSpecialization())
1343*67e74705SXin Li           break;
1344*67e74705SXin Li         CTPSD = NewCTPSD;
1345*67e74705SXin Li       }
1346*67e74705SXin Li       return CTPSD->getDefinition();
1347*67e74705SXin Li     }
1348*67e74705SXin Li   }
1349*67e74705SXin Li 
1350*67e74705SXin Li   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1351*67e74705SXin Li     if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
1352*67e74705SXin Li       const CXXRecordDecl *RD = this;
1353*67e74705SXin Li       while (auto *NewRD = RD->getInstantiatedFromMemberClass())
1354*67e74705SXin Li         RD = NewRD;
1355*67e74705SXin Li       return RD->getDefinition();
1356*67e74705SXin Li     }
1357*67e74705SXin Li   }
1358*67e74705SXin Li 
1359*67e74705SXin Li   assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
1360*67e74705SXin Li          "couldn't find pattern for class template instantiation");
1361*67e74705SXin Li   return nullptr;
1362*67e74705SXin Li }
1363*67e74705SXin Li 
getDestructor() const1364*67e74705SXin Li CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1365*67e74705SXin Li   ASTContext &Context = getASTContext();
1366*67e74705SXin Li   QualType ClassType = Context.getTypeDeclType(this);
1367*67e74705SXin Li 
1368*67e74705SXin Li   DeclarationName Name
1369*67e74705SXin Li     = Context.DeclarationNames.getCXXDestructorName(
1370*67e74705SXin Li                                           Context.getCanonicalType(ClassType));
1371*67e74705SXin Li 
1372*67e74705SXin Li   DeclContext::lookup_result R = lookup(Name);
1373*67e74705SXin Li   if (R.empty())
1374*67e74705SXin Li     return nullptr;
1375*67e74705SXin Li 
1376*67e74705SXin Li   CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(R.front());
1377*67e74705SXin Li   return Dtor;
1378*67e74705SXin Li }
1379*67e74705SXin Li 
isAnyDestructorNoReturn() const1380*67e74705SXin Li bool CXXRecordDecl::isAnyDestructorNoReturn() const {
1381*67e74705SXin Li   // Destructor is noreturn.
1382*67e74705SXin Li   if (const CXXDestructorDecl *Destructor = getDestructor())
1383*67e74705SXin Li     if (Destructor->isNoReturn())
1384*67e74705SXin Li       return true;
1385*67e74705SXin Li 
1386*67e74705SXin Li   // Check base classes destructor for noreturn.
1387*67e74705SXin Li   for (const auto &Base : bases())
1388*67e74705SXin Li     if (Base.getType()->getAsCXXRecordDecl()->isAnyDestructorNoReturn())
1389*67e74705SXin Li       return true;
1390*67e74705SXin Li 
1391*67e74705SXin Li   // Check fields for noreturn.
1392*67e74705SXin Li   for (const auto *Field : fields())
1393*67e74705SXin Li     if (const CXXRecordDecl *RD =
1394*67e74705SXin Li             Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1395*67e74705SXin Li       if (RD->isAnyDestructorNoReturn())
1396*67e74705SXin Li         return true;
1397*67e74705SXin Li 
1398*67e74705SXin Li   // All destructors are not noreturn.
1399*67e74705SXin Li   return false;
1400*67e74705SXin Li }
1401*67e74705SXin Li 
completeDefinition()1402*67e74705SXin Li void CXXRecordDecl::completeDefinition() {
1403*67e74705SXin Li   completeDefinition(nullptr);
1404*67e74705SXin Li }
1405*67e74705SXin Li 
completeDefinition(CXXFinalOverriderMap * FinalOverriders)1406*67e74705SXin Li void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1407*67e74705SXin Li   RecordDecl::completeDefinition();
1408*67e74705SXin Li 
1409*67e74705SXin Li   // If the class may be abstract (but hasn't been marked as such), check for
1410*67e74705SXin Li   // any pure final overriders.
1411*67e74705SXin Li   if (mayBeAbstract()) {
1412*67e74705SXin Li     CXXFinalOverriderMap MyFinalOverriders;
1413*67e74705SXin Li     if (!FinalOverriders) {
1414*67e74705SXin Li       getFinalOverriders(MyFinalOverriders);
1415*67e74705SXin Li       FinalOverriders = &MyFinalOverriders;
1416*67e74705SXin Li     }
1417*67e74705SXin Li 
1418*67e74705SXin Li     bool Done = false;
1419*67e74705SXin Li     for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1420*67e74705SXin Li                                      MEnd = FinalOverriders->end();
1421*67e74705SXin Li          M != MEnd && !Done; ++M) {
1422*67e74705SXin Li       for (OverridingMethods::iterator SO = M->second.begin(),
1423*67e74705SXin Li                                     SOEnd = M->second.end();
1424*67e74705SXin Li            SO != SOEnd && !Done; ++SO) {
1425*67e74705SXin Li         assert(SO->second.size() > 0 &&
1426*67e74705SXin Li                "All virtual functions have overridding virtual functions");
1427*67e74705SXin Li 
1428*67e74705SXin Li         // C++ [class.abstract]p4:
1429*67e74705SXin Li         //   A class is abstract if it contains or inherits at least one
1430*67e74705SXin Li         //   pure virtual function for which the final overrider is pure
1431*67e74705SXin Li         //   virtual.
1432*67e74705SXin Li         if (SO->second.front().Method->isPure()) {
1433*67e74705SXin Li           data().Abstract = true;
1434*67e74705SXin Li           Done = true;
1435*67e74705SXin Li           break;
1436*67e74705SXin Li         }
1437*67e74705SXin Li       }
1438*67e74705SXin Li     }
1439*67e74705SXin Li   }
1440*67e74705SXin Li 
1441*67e74705SXin Li   // Set access bits correctly on the directly-declared conversions.
1442*67e74705SXin Li   for (conversion_iterator I = conversion_begin(), E = conversion_end();
1443*67e74705SXin Li        I != E; ++I)
1444*67e74705SXin Li     I.setAccess((*I)->getAccess());
1445*67e74705SXin Li }
1446*67e74705SXin Li 
mayBeAbstract() const1447*67e74705SXin Li bool CXXRecordDecl::mayBeAbstract() const {
1448*67e74705SXin Li   if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
1449*67e74705SXin Li       isDependentContext())
1450*67e74705SXin Li     return false;
1451*67e74705SXin Li 
1452*67e74705SXin Li   for (const auto &B : bases()) {
1453*67e74705SXin Li     CXXRecordDecl *BaseDecl
1454*67e74705SXin Li       = cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl());
1455*67e74705SXin Li     if (BaseDecl->isAbstract())
1456*67e74705SXin Li       return true;
1457*67e74705SXin Li   }
1458*67e74705SXin Li 
1459*67e74705SXin Li   return false;
1460*67e74705SXin Li }
1461*67e74705SXin Li 
anchor()1462*67e74705SXin Li void CXXMethodDecl::anchor() { }
1463*67e74705SXin Li 
isStatic() const1464*67e74705SXin Li bool CXXMethodDecl::isStatic() const {
1465*67e74705SXin Li   const CXXMethodDecl *MD = getCanonicalDecl();
1466*67e74705SXin Li 
1467*67e74705SXin Li   if (MD->getStorageClass() == SC_Static)
1468*67e74705SXin Li     return true;
1469*67e74705SXin Li 
1470*67e74705SXin Li   OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
1471*67e74705SXin Li   return isStaticOverloadedOperator(OOK);
1472*67e74705SXin Li }
1473*67e74705SXin Li 
recursivelyOverrides(const CXXMethodDecl * DerivedMD,const CXXMethodDecl * BaseMD)1474*67e74705SXin Li static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
1475*67e74705SXin Li                                  const CXXMethodDecl *BaseMD) {
1476*67e74705SXin Li   for (CXXMethodDecl::method_iterator I = DerivedMD->begin_overridden_methods(),
1477*67e74705SXin Li          E = DerivedMD->end_overridden_methods(); I != E; ++I) {
1478*67e74705SXin Li     const CXXMethodDecl *MD = *I;
1479*67e74705SXin Li     if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
1480*67e74705SXin Li       return true;
1481*67e74705SXin Li     if (recursivelyOverrides(MD, BaseMD))
1482*67e74705SXin Li       return true;
1483*67e74705SXin Li   }
1484*67e74705SXin Li   return false;
1485*67e74705SXin Li }
1486*67e74705SXin Li 
1487*67e74705SXin Li CXXMethodDecl *
getCorrespondingMethodInClass(const CXXRecordDecl * RD,bool MayBeBase)1488*67e74705SXin Li CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
1489*67e74705SXin Li                                              bool MayBeBase) {
1490*67e74705SXin Li   if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
1491*67e74705SXin Li     return this;
1492*67e74705SXin Li 
1493*67e74705SXin Li   // Lookup doesn't work for destructors, so handle them separately.
1494*67e74705SXin Li   if (isa<CXXDestructorDecl>(this)) {
1495*67e74705SXin Li     CXXMethodDecl *MD = RD->getDestructor();
1496*67e74705SXin Li     if (MD) {
1497*67e74705SXin Li       if (recursivelyOverrides(MD, this))
1498*67e74705SXin Li         return MD;
1499*67e74705SXin Li       if (MayBeBase && recursivelyOverrides(this, MD))
1500*67e74705SXin Li         return MD;
1501*67e74705SXin Li     }
1502*67e74705SXin Li     return nullptr;
1503*67e74705SXin Li   }
1504*67e74705SXin Li 
1505*67e74705SXin Li   for (auto *ND : RD->lookup(getDeclName())) {
1506*67e74705SXin Li     CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND);
1507*67e74705SXin Li     if (!MD)
1508*67e74705SXin Li       continue;
1509*67e74705SXin Li     if (recursivelyOverrides(MD, this))
1510*67e74705SXin Li       return MD;
1511*67e74705SXin Li     if (MayBeBase && recursivelyOverrides(this, MD))
1512*67e74705SXin Li       return MD;
1513*67e74705SXin Li   }
1514*67e74705SXin Li 
1515*67e74705SXin Li   for (const auto &I : RD->bases()) {
1516*67e74705SXin Li     const RecordType *RT = I.getType()->getAs<RecordType>();
1517*67e74705SXin Li     if (!RT)
1518*67e74705SXin Li       continue;
1519*67e74705SXin Li     const CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl());
1520*67e74705SXin Li     CXXMethodDecl *T = this->getCorrespondingMethodInClass(Base);
1521*67e74705SXin Li     if (T)
1522*67e74705SXin Li       return T;
1523*67e74705SXin Li   }
1524*67e74705SXin Li 
1525*67e74705SXin Li   return nullptr;
1526*67e74705SXin Li }
1527*67e74705SXin Li 
1528*67e74705SXin Li CXXMethodDecl *
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,StorageClass SC,bool isInline,bool isConstexpr,SourceLocation EndLocation)1529*67e74705SXin Li CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1530*67e74705SXin Li                       SourceLocation StartLoc,
1531*67e74705SXin Li                       const DeclarationNameInfo &NameInfo,
1532*67e74705SXin Li                       QualType T, TypeSourceInfo *TInfo,
1533*67e74705SXin Li                       StorageClass SC, bool isInline,
1534*67e74705SXin Li                       bool isConstexpr, SourceLocation EndLocation) {
1535*67e74705SXin Li   return new (C, RD) CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo,
1536*67e74705SXin Li                                    T, TInfo, SC, isInline, isConstexpr,
1537*67e74705SXin Li                                    EndLocation);
1538*67e74705SXin Li }
1539*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)1540*67e74705SXin Li CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1541*67e74705SXin Li   return new (C, ID) CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
1542*67e74705SXin Li                                    DeclarationNameInfo(), QualType(), nullptr,
1543*67e74705SXin Li                                    SC_None, false, false, SourceLocation());
1544*67e74705SXin Li }
1545*67e74705SXin Li 
isUsualDeallocationFunction() const1546*67e74705SXin Li bool CXXMethodDecl::isUsualDeallocationFunction() const {
1547*67e74705SXin Li   if (getOverloadedOperator() != OO_Delete &&
1548*67e74705SXin Li       getOverloadedOperator() != OO_Array_Delete)
1549*67e74705SXin Li     return false;
1550*67e74705SXin Li 
1551*67e74705SXin Li   // C++ [basic.stc.dynamic.deallocation]p2:
1552*67e74705SXin Li   //   A template instance is never a usual deallocation function,
1553*67e74705SXin Li   //   regardless of its signature.
1554*67e74705SXin Li   if (getPrimaryTemplate())
1555*67e74705SXin Li     return false;
1556*67e74705SXin Li 
1557*67e74705SXin Li   // C++ [basic.stc.dynamic.deallocation]p2:
1558*67e74705SXin Li   //   If a class T has a member deallocation function named operator delete
1559*67e74705SXin Li   //   with exactly one parameter, then that function is a usual (non-placement)
1560*67e74705SXin Li   //   deallocation function. [...]
1561*67e74705SXin Li   if (getNumParams() == 1)
1562*67e74705SXin Li     return true;
1563*67e74705SXin Li 
1564*67e74705SXin Li   // C++ [basic.stc.dynamic.deallocation]p2:
1565*67e74705SXin Li   //   [...] If class T does not declare such an operator delete but does
1566*67e74705SXin Li   //   declare a member deallocation function named operator delete with
1567*67e74705SXin Li   //   exactly two parameters, the second of which has type std::size_t (18.1),
1568*67e74705SXin Li   //   then this function is a usual deallocation function.
1569*67e74705SXin Li   ASTContext &Context = getASTContext();
1570*67e74705SXin Li   if (getNumParams() != 2 ||
1571*67e74705SXin Li       !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(),
1572*67e74705SXin Li                                       Context.getSizeType()))
1573*67e74705SXin Li     return false;
1574*67e74705SXin Li 
1575*67e74705SXin Li   // This function is a usual deallocation function if there are no
1576*67e74705SXin Li   // single-parameter deallocation functions of the same kind.
1577*67e74705SXin Li   DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
1578*67e74705SXin Li   for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end();
1579*67e74705SXin Li        I != E; ++I) {
1580*67e74705SXin Li     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I))
1581*67e74705SXin Li       if (FD->getNumParams() == 1)
1582*67e74705SXin Li         return false;
1583*67e74705SXin Li   }
1584*67e74705SXin Li 
1585*67e74705SXin Li   return true;
1586*67e74705SXin Li }
1587*67e74705SXin Li 
isCopyAssignmentOperator() const1588*67e74705SXin Li bool CXXMethodDecl::isCopyAssignmentOperator() const {
1589*67e74705SXin Li   // C++0x [class.copy]p17:
1590*67e74705SXin Li   //  A user-declared copy assignment operator X::operator= is a non-static
1591*67e74705SXin Li   //  non-template member function of class X with exactly one parameter of
1592*67e74705SXin Li   //  type X, X&, const X&, volatile X& or const volatile X&.
1593*67e74705SXin Li   if (/*operator=*/getOverloadedOperator() != OO_Equal ||
1594*67e74705SXin Li       /*non-static*/ isStatic() ||
1595*67e74705SXin Li       /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1596*67e74705SXin Li       getNumParams() != 1)
1597*67e74705SXin Li     return false;
1598*67e74705SXin Li 
1599*67e74705SXin Li   QualType ParamType = getParamDecl(0)->getType();
1600*67e74705SXin Li   if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>())
1601*67e74705SXin Li     ParamType = Ref->getPointeeType();
1602*67e74705SXin Li 
1603*67e74705SXin Li   ASTContext &Context = getASTContext();
1604*67e74705SXin Li   QualType ClassType
1605*67e74705SXin Li     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1606*67e74705SXin Li   return Context.hasSameUnqualifiedType(ClassType, ParamType);
1607*67e74705SXin Li }
1608*67e74705SXin Li 
isMoveAssignmentOperator() const1609*67e74705SXin Li bool CXXMethodDecl::isMoveAssignmentOperator() const {
1610*67e74705SXin Li   // C++0x [class.copy]p19:
1611*67e74705SXin Li   //  A user-declared move assignment operator X::operator= is a non-static
1612*67e74705SXin Li   //  non-template member function of class X with exactly one parameter of type
1613*67e74705SXin Li   //  X&&, const X&&, volatile X&&, or const volatile X&&.
1614*67e74705SXin Li   if (getOverloadedOperator() != OO_Equal || isStatic() ||
1615*67e74705SXin Li       getPrimaryTemplate() || getDescribedFunctionTemplate() ||
1616*67e74705SXin Li       getNumParams() != 1)
1617*67e74705SXin Li     return false;
1618*67e74705SXin Li 
1619*67e74705SXin Li   QualType ParamType = getParamDecl(0)->getType();
1620*67e74705SXin Li   if (!isa<RValueReferenceType>(ParamType))
1621*67e74705SXin Li     return false;
1622*67e74705SXin Li   ParamType = ParamType->getPointeeType();
1623*67e74705SXin Li 
1624*67e74705SXin Li   ASTContext &Context = getASTContext();
1625*67e74705SXin Li   QualType ClassType
1626*67e74705SXin Li     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
1627*67e74705SXin Li   return Context.hasSameUnqualifiedType(ClassType, ParamType);
1628*67e74705SXin Li }
1629*67e74705SXin Li 
addOverriddenMethod(const CXXMethodDecl * MD)1630*67e74705SXin Li void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
1631*67e74705SXin Li   assert(MD->isCanonicalDecl() && "Method is not canonical!");
1632*67e74705SXin Li   assert(!MD->getParent()->isDependentContext() &&
1633*67e74705SXin Li          "Can't add an overridden method to a class template!");
1634*67e74705SXin Li   assert(MD->isVirtual() && "Method is not virtual!");
1635*67e74705SXin Li 
1636*67e74705SXin Li   getASTContext().addOverriddenMethod(this, MD);
1637*67e74705SXin Li }
1638*67e74705SXin Li 
begin_overridden_methods() const1639*67e74705SXin Li CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
1640*67e74705SXin Li   if (isa<CXXConstructorDecl>(this)) return nullptr;
1641*67e74705SXin Li   return getASTContext().overridden_methods_begin(this);
1642*67e74705SXin Li }
1643*67e74705SXin Li 
end_overridden_methods() const1644*67e74705SXin Li CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
1645*67e74705SXin Li   if (isa<CXXConstructorDecl>(this)) return nullptr;
1646*67e74705SXin Li   return getASTContext().overridden_methods_end(this);
1647*67e74705SXin Li }
1648*67e74705SXin Li 
size_overridden_methods() const1649*67e74705SXin Li unsigned CXXMethodDecl::size_overridden_methods() const {
1650*67e74705SXin Li   if (isa<CXXConstructorDecl>(this)) return 0;
1651*67e74705SXin Li   return getASTContext().overridden_methods_size(this);
1652*67e74705SXin Li }
1653*67e74705SXin Li 
1654*67e74705SXin Li CXXMethodDecl::overridden_method_range
overridden_methods() const1655*67e74705SXin Li CXXMethodDecl::overridden_methods() const {
1656*67e74705SXin Li   if (isa<CXXConstructorDecl>(this))
1657*67e74705SXin Li     return overridden_method_range(nullptr, nullptr);
1658*67e74705SXin Li   return getASTContext().overridden_methods(this);
1659*67e74705SXin Li }
1660*67e74705SXin Li 
getThisType(ASTContext & C) const1661*67e74705SXin Li QualType CXXMethodDecl::getThisType(ASTContext &C) const {
1662*67e74705SXin Li   // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
1663*67e74705SXin Li   // If the member function is declared const, the type of this is const X*,
1664*67e74705SXin Li   // if the member function is declared volatile, the type of this is
1665*67e74705SXin Li   // volatile X*, and if the member function is declared const volatile,
1666*67e74705SXin Li   // the type of this is const volatile X*.
1667*67e74705SXin Li 
1668*67e74705SXin Li   assert(isInstance() && "No 'this' for static methods!");
1669*67e74705SXin Li 
1670*67e74705SXin Li   QualType ClassTy = C.getTypeDeclType(getParent());
1671*67e74705SXin Li   ClassTy = C.getQualifiedType(ClassTy,
1672*67e74705SXin Li                                Qualifiers::fromCVRUMask(getTypeQualifiers()));
1673*67e74705SXin Li   return C.getPointerType(ClassTy);
1674*67e74705SXin Li }
1675*67e74705SXin Li 
hasInlineBody() const1676*67e74705SXin Li bool CXXMethodDecl::hasInlineBody() const {
1677*67e74705SXin Li   // If this function is a template instantiation, look at the template from
1678*67e74705SXin Li   // which it was instantiated.
1679*67e74705SXin Li   const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
1680*67e74705SXin Li   if (!CheckFn)
1681*67e74705SXin Li     CheckFn = this;
1682*67e74705SXin Li 
1683*67e74705SXin Li   const FunctionDecl *fn;
1684*67e74705SXin Li   return CheckFn->hasBody(fn) && !fn->isOutOfLine();
1685*67e74705SXin Li }
1686*67e74705SXin Li 
isLambdaStaticInvoker() const1687*67e74705SXin Li bool CXXMethodDecl::isLambdaStaticInvoker() const {
1688*67e74705SXin Li   const CXXRecordDecl *P = getParent();
1689*67e74705SXin Li   if (P->isLambda()) {
1690*67e74705SXin Li     if (const CXXMethodDecl *StaticInvoker = P->getLambdaStaticInvoker()) {
1691*67e74705SXin Li       if (StaticInvoker == this) return true;
1692*67e74705SXin Li       if (P->isGenericLambda() && this->isFunctionTemplateSpecialization())
1693*67e74705SXin Li         return StaticInvoker == this->getPrimaryTemplate()->getTemplatedDecl();
1694*67e74705SXin Li     }
1695*67e74705SXin Li   }
1696*67e74705SXin Li   return false;
1697*67e74705SXin Li }
1698*67e74705SXin Li 
CXXCtorInitializer(ASTContext & Context,TypeSourceInfo * TInfo,bool IsVirtual,SourceLocation L,Expr * Init,SourceLocation R,SourceLocation EllipsisLoc)1699*67e74705SXin Li CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1700*67e74705SXin Li                                        TypeSourceInfo *TInfo, bool IsVirtual,
1701*67e74705SXin Li                                        SourceLocation L, Expr *Init,
1702*67e74705SXin Li                                        SourceLocation R,
1703*67e74705SXin Li                                        SourceLocation EllipsisLoc)
1704*67e74705SXin Li   : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
1705*67e74705SXin Li     LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
1706*67e74705SXin Li     IsWritten(false), SourceOrderOrNumArrayIndices(0)
1707*67e74705SXin Li {
1708*67e74705SXin Li }
1709*67e74705SXin Li 
CXXCtorInitializer(ASTContext & Context,FieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R)1710*67e74705SXin Li CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1711*67e74705SXin Li                                        FieldDecl *Member,
1712*67e74705SXin Li                                        SourceLocation MemberLoc,
1713*67e74705SXin Li                                        SourceLocation L, Expr *Init,
1714*67e74705SXin Li                                        SourceLocation R)
1715*67e74705SXin Li   : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
1716*67e74705SXin Li     LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
1717*67e74705SXin Li     IsWritten(false), SourceOrderOrNumArrayIndices(0)
1718*67e74705SXin Li {
1719*67e74705SXin Li }
1720*67e74705SXin Li 
CXXCtorInitializer(ASTContext & Context,IndirectFieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R)1721*67e74705SXin Li CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1722*67e74705SXin Li                                        IndirectFieldDecl *Member,
1723*67e74705SXin Li                                        SourceLocation MemberLoc,
1724*67e74705SXin Li                                        SourceLocation L, Expr *Init,
1725*67e74705SXin Li                                        SourceLocation R)
1726*67e74705SXin Li   : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
1727*67e74705SXin Li     LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
1728*67e74705SXin Li     IsWritten(false), SourceOrderOrNumArrayIndices(0)
1729*67e74705SXin Li {
1730*67e74705SXin Li }
1731*67e74705SXin Li 
CXXCtorInitializer(ASTContext & Context,TypeSourceInfo * TInfo,SourceLocation L,Expr * Init,SourceLocation R)1732*67e74705SXin Li CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1733*67e74705SXin Li                                        TypeSourceInfo *TInfo,
1734*67e74705SXin Li                                        SourceLocation L, Expr *Init,
1735*67e74705SXin Li                                        SourceLocation R)
1736*67e74705SXin Li   : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init),
1737*67e74705SXin Li     LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false),
1738*67e74705SXin Li     IsWritten(false), SourceOrderOrNumArrayIndices(0)
1739*67e74705SXin Li {
1740*67e74705SXin Li }
1741*67e74705SXin Li 
CXXCtorInitializer(ASTContext & Context,FieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R,VarDecl ** Indices,unsigned NumIndices)1742*67e74705SXin Li CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
1743*67e74705SXin Li                                        FieldDecl *Member,
1744*67e74705SXin Li                                        SourceLocation MemberLoc,
1745*67e74705SXin Li                                        SourceLocation L, Expr *Init,
1746*67e74705SXin Li                                        SourceLocation R,
1747*67e74705SXin Li                                        VarDecl **Indices,
1748*67e74705SXin Li                                        unsigned NumIndices)
1749*67e74705SXin Li   : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
1750*67e74705SXin Li     LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
1751*67e74705SXin Li     IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
1752*67e74705SXin Li {
1753*67e74705SXin Li   std::uninitialized_copy(Indices, Indices + NumIndices,
1754*67e74705SXin Li                           getTrailingObjects<VarDecl *>());
1755*67e74705SXin Li }
1756*67e74705SXin Li 
Create(ASTContext & Context,FieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R,VarDecl ** Indices,unsigned NumIndices)1757*67e74705SXin Li CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context,
1758*67e74705SXin Li                                                FieldDecl *Member,
1759*67e74705SXin Li                                                SourceLocation MemberLoc,
1760*67e74705SXin Li                                                SourceLocation L, Expr *Init,
1761*67e74705SXin Li                                                SourceLocation R,
1762*67e74705SXin Li                                                VarDecl **Indices,
1763*67e74705SXin Li                                                unsigned NumIndices) {
1764*67e74705SXin Li   void *Mem = Context.Allocate(totalSizeToAlloc<VarDecl *>(NumIndices),
1765*67e74705SXin Li                                llvm::alignOf<CXXCtorInitializer>());
1766*67e74705SXin Li   return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R,
1767*67e74705SXin Li                                       Indices, NumIndices);
1768*67e74705SXin Li }
1769*67e74705SXin Li 
getBaseClassLoc() const1770*67e74705SXin Li TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
1771*67e74705SXin Li   if (isBaseInitializer())
1772*67e74705SXin Li     return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
1773*67e74705SXin Li   else
1774*67e74705SXin Li     return TypeLoc();
1775*67e74705SXin Li }
1776*67e74705SXin Li 
getBaseClass() const1777*67e74705SXin Li const Type *CXXCtorInitializer::getBaseClass() const {
1778*67e74705SXin Li   if (isBaseInitializer())
1779*67e74705SXin Li     return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
1780*67e74705SXin Li   else
1781*67e74705SXin Li     return nullptr;
1782*67e74705SXin Li }
1783*67e74705SXin Li 
getSourceLocation() const1784*67e74705SXin Li SourceLocation CXXCtorInitializer::getSourceLocation() const {
1785*67e74705SXin Li   if (isInClassMemberInitializer())
1786*67e74705SXin Li     return getAnyMember()->getLocation();
1787*67e74705SXin Li 
1788*67e74705SXin Li   if (isAnyMemberInitializer())
1789*67e74705SXin Li     return getMemberLocation();
1790*67e74705SXin Li 
1791*67e74705SXin Li   if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>())
1792*67e74705SXin Li     return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
1793*67e74705SXin Li 
1794*67e74705SXin Li   return SourceLocation();
1795*67e74705SXin Li }
1796*67e74705SXin Li 
getSourceRange() const1797*67e74705SXin Li SourceRange CXXCtorInitializer::getSourceRange() const {
1798*67e74705SXin Li   if (isInClassMemberInitializer()) {
1799*67e74705SXin Li     FieldDecl *D = getAnyMember();
1800*67e74705SXin Li     if (Expr *I = D->getInClassInitializer())
1801*67e74705SXin Li       return I->getSourceRange();
1802*67e74705SXin Li     return SourceRange();
1803*67e74705SXin Li   }
1804*67e74705SXin Li 
1805*67e74705SXin Li   return SourceRange(getSourceLocation(), getRParenLoc());
1806*67e74705SXin Li }
1807*67e74705SXin Li 
anchor()1808*67e74705SXin Li void CXXConstructorDecl::anchor() { }
1809*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID,bool Inherited)1810*67e74705SXin Li CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
1811*67e74705SXin Li                                                            unsigned ID,
1812*67e74705SXin Li                                                            bool Inherited) {
1813*67e74705SXin Li   unsigned Extra = additionalSizeToAlloc<InheritedConstructor>(Inherited);
1814*67e74705SXin Li   auto *Result = new (C, ID, Extra) CXXConstructorDecl(
1815*67e74705SXin Li       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
1816*67e74705SXin Li       false, false, false, false, InheritedConstructor());
1817*67e74705SXin Li   Result->IsInheritingConstructor = Inherited;
1818*67e74705SXin Li   return Result;
1819*67e74705SXin Li }
1820*67e74705SXin Li 
1821*67e74705SXin Li CXXConstructorDecl *
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isExplicit,bool isInline,bool isImplicitlyDeclared,bool isConstexpr,InheritedConstructor Inherited)1822*67e74705SXin Li CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1823*67e74705SXin Li                            SourceLocation StartLoc,
1824*67e74705SXin Li                            const DeclarationNameInfo &NameInfo,
1825*67e74705SXin Li                            QualType T, TypeSourceInfo *TInfo,
1826*67e74705SXin Li                            bool isExplicit, bool isInline,
1827*67e74705SXin Li                            bool isImplicitlyDeclared, bool isConstexpr,
1828*67e74705SXin Li                            InheritedConstructor Inherited) {
1829*67e74705SXin Li   assert(NameInfo.getName().getNameKind()
1830*67e74705SXin Li          == DeclarationName::CXXConstructorName &&
1831*67e74705SXin Li          "Name must refer to a constructor");
1832*67e74705SXin Li   unsigned Extra =
1833*67e74705SXin Li       additionalSizeToAlloc<InheritedConstructor>(Inherited ? 1 : 0);
1834*67e74705SXin Li   return new (C, RD, Extra) CXXConstructorDecl(
1835*67e74705SXin Li       C, RD, StartLoc, NameInfo, T, TInfo, isExplicit, isInline,
1836*67e74705SXin Li       isImplicitlyDeclared, isConstexpr, Inherited);
1837*67e74705SXin Li }
1838*67e74705SXin Li 
init_begin() const1839*67e74705SXin Li CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
1840*67e74705SXin Li   return CtorInitializers.get(getASTContext().getExternalSource());
1841*67e74705SXin Li }
1842*67e74705SXin Li 
getTargetConstructor() const1843*67e74705SXin Li CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
1844*67e74705SXin Li   assert(isDelegatingConstructor() && "Not a delegating constructor!");
1845*67e74705SXin Li   Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
1846*67e74705SXin Li   if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E))
1847*67e74705SXin Li     return Construct->getConstructor();
1848*67e74705SXin Li 
1849*67e74705SXin Li   return nullptr;
1850*67e74705SXin Li }
1851*67e74705SXin Li 
isDefaultConstructor() const1852*67e74705SXin Li bool CXXConstructorDecl::isDefaultConstructor() const {
1853*67e74705SXin Li   // C++ [class.ctor]p5:
1854*67e74705SXin Li   //   A default constructor for a class X is a constructor of class
1855*67e74705SXin Li   //   X that can be called without an argument.
1856*67e74705SXin Li   return (getNumParams() == 0) ||
1857*67e74705SXin Li          (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
1858*67e74705SXin Li }
1859*67e74705SXin Li 
1860*67e74705SXin Li bool
isCopyConstructor(unsigned & TypeQuals) const1861*67e74705SXin Li CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
1862*67e74705SXin Li   return isCopyOrMoveConstructor(TypeQuals) &&
1863*67e74705SXin Li          getParamDecl(0)->getType()->isLValueReferenceType();
1864*67e74705SXin Li }
1865*67e74705SXin Li 
isMoveConstructor(unsigned & TypeQuals) const1866*67e74705SXin Li bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
1867*67e74705SXin Li   return isCopyOrMoveConstructor(TypeQuals) &&
1868*67e74705SXin Li     getParamDecl(0)->getType()->isRValueReferenceType();
1869*67e74705SXin Li }
1870*67e74705SXin Li 
1871*67e74705SXin Li /// \brief Determine whether this is a copy or move constructor.
isCopyOrMoveConstructor(unsigned & TypeQuals) const1872*67e74705SXin Li bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
1873*67e74705SXin Li   // C++ [class.copy]p2:
1874*67e74705SXin Li   //   A non-template constructor for class X is a copy constructor
1875*67e74705SXin Li   //   if its first parameter is of type X&, const X&, volatile X& or
1876*67e74705SXin Li   //   const volatile X&, and either there are no other parameters
1877*67e74705SXin Li   //   or else all other parameters have default arguments (8.3.6).
1878*67e74705SXin Li   // C++0x [class.copy]p3:
1879*67e74705SXin Li   //   A non-template constructor for class X is a move constructor if its
1880*67e74705SXin Li   //   first parameter is of type X&&, const X&&, volatile X&&, or
1881*67e74705SXin Li   //   const volatile X&&, and either there are no other parameters or else
1882*67e74705SXin Li   //   all other parameters have default arguments.
1883*67e74705SXin Li   if ((getNumParams() < 1) ||
1884*67e74705SXin Li       (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
1885*67e74705SXin Li       (getPrimaryTemplate() != nullptr) ||
1886*67e74705SXin Li       (getDescribedFunctionTemplate() != nullptr))
1887*67e74705SXin Li     return false;
1888*67e74705SXin Li 
1889*67e74705SXin Li   const ParmVarDecl *Param = getParamDecl(0);
1890*67e74705SXin Li 
1891*67e74705SXin Li   // Do we have a reference type?
1892*67e74705SXin Li   const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>();
1893*67e74705SXin Li   if (!ParamRefType)
1894*67e74705SXin Li     return false;
1895*67e74705SXin Li 
1896*67e74705SXin Li   // Is it a reference to our class type?
1897*67e74705SXin Li   ASTContext &Context = getASTContext();
1898*67e74705SXin Li 
1899*67e74705SXin Li   CanQualType PointeeType
1900*67e74705SXin Li     = Context.getCanonicalType(ParamRefType->getPointeeType());
1901*67e74705SXin Li   CanQualType ClassTy
1902*67e74705SXin Li     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
1903*67e74705SXin Li   if (PointeeType.getUnqualifiedType() != ClassTy)
1904*67e74705SXin Li     return false;
1905*67e74705SXin Li 
1906*67e74705SXin Li   // FIXME: other qualifiers?
1907*67e74705SXin Li 
1908*67e74705SXin Li   // We have a copy or move constructor.
1909*67e74705SXin Li   TypeQuals = PointeeType.getCVRQualifiers();
1910*67e74705SXin Li   return true;
1911*67e74705SXin Li }
1912*67e74705SXin Li 
isConvertingConstructor(bool AllowExplicit) const1913*67e74705SXin Li bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
1914*67e74705SXin Li   // C++ [class.conv.ctor]p1:
1915*67e74705SXin Li   //   A constructor declared without the function-specifier explicit
1916*67e74705SXin Li   //   that can be called with a single parameter specifies a
1917*67e74705SXin Li   //   conversion from the type of its first parameter to the type of
1918*67e74705SXin Li   //   its class. Such a constructor is called a converting
1919*67e74705SXin Li   //   constructor.
1920*67e74705SXin Li   if (isExplicit() && !AllowExplicit)
1921*67e74705SXin Li     return false;
1922*67e74705SXin Li 
1923*67e74705SXin Li   return (getNumParams() == 0 &&
1924*67e74705SXin Li           getType()->getAs<FunctionProtoType>()->isVariadic()) ||
1925*67e74705SXin Li          (getNumParams() == 1) ||
1926*67e74705SXin Li          (getNumParams() > 1 &&
1927*67e74705SXin Li           (getParamDecl(1)->hasDefaultArg() ||
1928*67e74705SXin Li            getParamDecl(1)->isParameterPack()));
1929*67e74705SXin Li }
1930*67e74705SXin Li 
isSpecializationCopyingObject() const1931*67e74705SXin Li bool CXXConstructorDecl::isSpecializationCopyingObject() const {
1932*67e74705SXin Li   if ((getNumParams() < 1) ||
1933*67e74705SXin Li       (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) ||
1934*67e74705SXin Li       (getDescribedFunctionTemplate() != nullptr))
1935*67e74705SXin Li     return false;
1936*67e74705SXin Li 
1937*67e74705SXin Li   const ParmVarDecl *Param = getParamDecl(0);
1938*67e74705SXin Li 
1939*67e74705SXin Li   ASTContext &Context = getASTContext();
1940*67e74705SXin Li   CanQualType ParamType = Context.getCanonicalType(Param->getType());
1941*67e74705SXin Li 
1942*67e74705SXin Li   // Is it the same as our our class type?
1943*67e74705SXin Li   CanQualType ClassTy
1944*67e74705SXin Li     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
1945*67e74705SXin Li   if (ParamType.getUnqualifiedType() != ClassTy)
1946*67e74705SXin Li     return false;
1947*67e74705SXin Li 
1948*67e74705SXin Li   return true;
1949*67e74705SXin Li }
1950*67e74705SXin Li 
anchor()1951*67e74705SXin Li void CXXDestructorDecl::anchor() { }
1952*67e74705SXin Li 
1953*67e74705SXin Li CXXDestructorDecl *
CreateDeserialized(ASTContext & C,unsigned ID)1954*67e74705SXin Li CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1955*67e74705SXin Li   return new (C, ID)
1956*67e74705SXin Li       CXXDestructorDecl(C, nullptr, SourceLocation(), DeclarationNameInfo(),
1957*67e74705SXin Li                         QualType(), nullptr, false, false);
1958*67e74705SXin Li }
1959*67e74705SXin Li 
1960*67e74705SXin Li CXXDestructorDecl *
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,bool isImplicitlyDeclared)1961*67e74705SXin Li CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1962*67e74705SXin Li                           SourceLocation StartLoc,
1963*67e74705SXin Li                           const DeclarationNameInfo &NameInfo,
1964*67e74705SXin Li                           QualType T, TypeSourceInfo *TInfo,
1965*67e74705SXin Li                           bool isInline, bool isImplicitlyDeclared) {
1966*67e74705SXin Li   assert(NameInfo.getName().getNameKind()
1967*67e74705SXin Li          == DeclarationName::CXXDestructorName &&
1968*67e74705SXin Li          "Name must refer to a destructor");
1969*67e74705SXin Li   return new (C, RD) CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo,
1970*67e74705SXin Li                                        isInline, isImplicitlyDeclared);
1971*67e74705SXin Li }
1972*67e74705SXin Li 
setOperatorDelete(FunctionDecl * OD)1973*67e74705SXin Li void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD) {
1974*67e74705SXin Li   auto *First = cast<CXXDestructorDecl>(getFirstDecl());
1975*67e74705SXin Li   if (OD && !First->OperatorDelete) {
1976*67e74705SXin Li     First->OperatorDelete = OD;
1977*67e74705SXin Li     if (auto *L = getASTMutationListener())
1978*67e74705SXin Li       L->ResolvedOperatorDelete(First, OD);
1979*67e74705SXin Li   }
1980*67e74705SXin Li }
1981*67e74705SXin Li 
anchor()1982*67e74705SXin Li void CXXConversionDecl::anchor() { }
1983*67e74705SXin Li 
1984*67e74705SXin Li CXXConversionDecl *
CreateDeserialized(ASTContext & C,unsigned ID)1985*67e74705SXin Li CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1986*67e74705SXin Li   return new (C, ID) CXXConversionDecl(C, nullptr, SourceLocation(),
1987*67e74705SXin Li                                        DeclarationNameInfo(), QualType(),
1988*67e74705SXin Li                                        nullptr, false, false, false,
1989*67e74705SXin Li                                        SourceLocation());
1990*67e74705SXin Li }
1991*67e74705SXin Li 
1992*67e74705SXin Li CXXConversionDecl *
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,bool isExplicit,bool isConstexpr,SourceLocation EndLocation)1993*67e74705SXin Li CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,
1994*67e74705SXin Li                           SourceLocation StartLoc,
1995*67e74705SXin Li                           const DeclarationNameInfo &NameInfo,
1996*67e74705SXin Li                           QualType T, TypeSourceInfo *TInfo,
1997*67e74705SXin Li                           bool isInline, bool isExplicit,
1998*67e74705SXin Li                           bool isConstexpr, SourceLocation EndLocation) {
1999*67e74705SXin Li   assert(NameInfo.getName().getNameKind()
2000*67e74705SXin Li          == DeclarationName::CXXConversionFunctionName &&
2001*67e74705SXin Li          "Name must refer to a conversion function");
2002*67e74705SXin Li   return new (C, RD) CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo,
2003*67e74705SXin Li                                        isInline, isExplicit, isConstexpr,
2004*67e74705SXin Li                                        EndLocation);
2005*67e74705SXin Li }
2006*67e74705SXin Li 
isLambdaToBlockPointerConversion() const2007*67e74705SXin Li bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2008*67e74705SXin Li   return isImplicit() && getParent()->isLambda() &&
2009*67e74705SXin Li          getConversionType()->isBlockPointerType();
2010*67e74705SXin Li }
2011*67e74705SXin Li 
anchor()2012*67e74705SXin Li void LinkageSpecDecl::anchor() { }
2013*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation ExternLoc,SourceLocation LangLoc,LanguageIDs Lang,bool HasBraces)2014*67e74705SXin Li LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
2015*67e74705SXin Li                                          DeclContext *DC,
2016*67e74705SXin Li                                          SourceLocation ExternLoc,
2017*67e74705SXin Li                                          SourceLocation LangLoc,
2018*67e74705SXin Li                                          LanguageIDs Lang,
2019*67e74705SXin Li                                          bool HasBraces) {
2020*67e74705SXin Li   return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2021*67e74705SXin Li }
2022*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2023*67e74705SXin Li LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2024*67e74705SXin Li                                                      unsigned ID) {
2025*67e74705SXin Li   return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
2026*67e74705SXin Li                                      SourceLocation(), lang_c, false);
2027*67e74705SXin Li }
2028*67e74705SXin Li 
anchor()2029*67e74705SXin Li void UsingDirectiveDecl::anchor() { }
2030*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation L,SourceLocation NamespaceLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Used,DeclContext * CommonAncestor)2031*67e74705SXin Li UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2032*67e74705SXin Li                                                SourceLocation L,
2033*67e74705SXin Li                                                SourceLocation NamespaceLoc,
2034*67e74705SXin Li                                            NestedNameSpecifierLoc QualifierLoc,
2035*67e74705SXin Li                                                SourceLocation IdentLoc,
2036*67e74705SXin Li                                                NamedDecl *Used,
2037*67e74705SXin Li                                                DeclContext *CommonAncestor) {
2038*67e74705SXin Li   if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2039*67e74705SXin Li     Used = NS->getOriginalNamespace();
2040*67e74705SXin Li   return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2041*67e74705SXin Li                                         IdentLoc, Used, CommonAncestor);
2042*67e74705SXin Li }
2043*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2044*67e74705SXin Li UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2045*67e74705SXin Li                                                            unsigned ID) {
2046*67e74705SXin Li   return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2047*67e74705SXin Li                                         SourceLocation(),
2048*67e74705SXin Li                                         NestedNameSpecifierLoc(),
2049*67e74705SXin Li                                         SourceLocation(), nullptr, nullptr);
2050*67e74705SXin Li }
2051*67e74705SXin Li 
getNominatedNamespace()2052*67e74705SXin Li NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2053*67e74705SXin Li   if (NamespaceAliasDecl *NA =
2054*67e74705SXin Li         dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2055*67e74705SXin Li     return NA->getNamespace();
2056*67e74705SXin Li   return cast_or_null<NamespaceDecl>(NominatedNamespace);
2057*67e74705SXin Li }
2058*67e74705SXin Li 
NamespaceDecl(ASTContext & C,DeclContext * DC,bool Inline,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,NamespaceDecl * PrevDecl)2059*67e74705SXin Li NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
2060*67e74705SXin Li                              SourceLocation StartLoc, SourceLocation IdLoc,
2061*67e74705SXin Li                              IdentifierInfo *Id, NamespaceDecl *PrevDecl)
2062*67e74705SXin Li     : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
2063*67e74705SXin Li       redeclarable_base(C), LocStart(StartLoc), RBraceLoc(),
2064*67e74705SXin Li       AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2065*67e74705SXin Li   setPreviousDecl(PrevDecl);
2066*67e74705SXin Li 
2067*67e74705SXin Li   if (PrevDecl)
2068*67e74705SXin Li     AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2069*67e74705SXin Li }
2070*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,bool Inline,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,NamespaceDecl * PrevDecl)2071*67e74705SXin Li NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2072*67e74705SXin Li                                      bool Inline, SourceLocation StartLoc,
2073*67e74705SXin Li                                      SourceLocation IdLoc, IdentifierInfo *Id,
2074*67e74705SXin Li                                      NamespaceDecl *PrevDecl) {
2075*67e74705SXin Li   return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
2076*67e74705SXin Li                                    PrevDecl);
2077*67e74705SXin Li }
2078*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2079*67e74705SXin Li NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2080*67e74705SXin Li   return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
2081*67e74705SXin Li                                    SourceLocation(), nullptr, nullptr);
2082*67e74705SXin Li }
2083*67e74705SXin Li 
getOriginalNamespace()2084*67e74705SXin Li NamespaceDecl *NamespaceDecl::getOriginalNamespace() {
2085*67e74705SXin Li   if (isFirstDecl())
2086*67e74705SXin Li     return this;
2087*67e74705SXin Li 
2088*67e74705SXin Li   return AnonOrFirstNamespaceAndInline.getPointer();
2089*67e74705SXin Li }
2090*67e74705SXin Li 
getOriginalNamespace() const2091*67e74705SXin Li const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
2092*67e74705SXin Li   if (isFirstDecl())
2093*67e74705SXin Li     return this;
2094*67e74705SXin Li 
2095*67e74705SXin Li   return AnonOrFirstNamespaceAndInline.getPointer();
2096*67e74705SXin Li }
2097*67e74705SXin Li 
isOriginalNamespace() const2098*67e74705SXin Li bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
2099*67e74705SXin Li 
getNextRedeclarationImpl()2100*67e74705SXin Li NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
2101*67e74705SXin Li   return getNextRedeclaration();
2102*67e74705SXin Li }
getPreviousDeclImpl()2103*67e74705SXin Li NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2104*67e74705SXin Li   return getPreviousDecl();
2105*67e74705SXin Li }
getMostRecentDeclImpl()2106*67e74705SXin Li NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2107*67e74705SXin Li   return getMostRecentDecl();
2108*67e74705SXin Li }
2109*67e74705SXin Li 
anchor()2110*67e74705SXin Li void NamespaceAliasDecl::anchor() { }
2111*67e74705SXin Li 
getNextRedeclarationImpl()2112*67e74705SXin Li NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2113*67e74705SXin Li   return getNextRedeclaration();
2114*67e74705SXin Li }
getPreviousDeclImpl()2115*67e74705SXin Li NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2116*67e74705SXin Li   return getPreviousDecl();
2117*67e74705SXin Li }
getMostRecentDeclImpl()2118*67e74705SXin Li NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2119*67e74705SXin Li   return getMostRecentDecl();
2120*67e74705SXin Li }
2121*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,SourceLocation AliasLoc,IdentifierInfo * Alias,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Namespace)2122*67e74705SXin Li NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
2123*67e74705SXin Li                                                SourceLocation UsingLoc,
2124*67e74705SXin Li                                                SourceLocation AliasLoc,
2125*67e74705SXin Li                                                IdentifierInfo *Alias,
2126*67e74705SXin Li                                            NestedNameSpecifierLoc QualifierLoc,
2127*67e74705SXin Li                                                SourceLocation IdentLoc,
2128*67e74705SXin Li                                                NamedDecl *Namespace) {
2129*67e74705SXin Li   // FIXME: Preserve the aliased namespace as written.
2130*67e74705SXin Li   if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2131*67e74705SXin Li     Namespace = NS->getOriginalNamespace();
2132*67e74705SXin Li   return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
2133*67e74705SXin Li                                         QualifierLoc, IdentLoc, Namespace);
2134*67e74705SXin Li }
2135*67e74705SXin Li 
2136*67e74705SXin Li NamespaceAliasDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2137*67e74705SXin Li NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2138*67e74705SXin Li   return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
2139*67e74705SXin Li                                         SourceLocation(), nullptr,
2140*67e74705SXin Li                                         NestedNameSpecifierLoc(),
2141*67e74705SXin Li                                         SourceLocation(), nullptr);
2142*67e74705SXin Li }
2143*67e74705SXin Li 
anchor()2144*67e74705SXin Li void UsingShadowDecl::anchor() { }
2145*67e74705SXin Li 
UsingShadowDecl(Kind K,ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target)2146*67e74705SXin Li UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
2147*67e74705SXin Li                                  SourceLocation Loc, UsingDecl *Using,
2148*67e74705SXin Li                                  NamedDecl *Target)
2149*67e74705SXin Li     : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
2150*67e74705SXin Li       redeclarable_base(C), Underlying(Target),
2151*67e74705SXin Li       UsingOrNextShadow(cast<NamedDecl>(Using)) {
2152*67e74705SXin Li   if (Target)
2153*67e74705SXin Li     IdentifierNamespace = Target->getIdentifierNamespace();
2154*67e74705SXin Li   setImplicit();
2155*67e74705SXin Li }
2156*67e74705SXin Li 
UsingShadowDecl(Kind K,ASTContext & C,EmptyShell Empty)2157*67e74705SXin Li UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
2158*67e74705SXin Li     : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
2159*67e74705SXin Li       redeclarable_base(C), Underlying(), UsingOrNextShadow() {}
2160*67e74705SXin Li 
2161*67e74705SXin Li UsingShadowDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2162*67e74705SXin Li UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2163*67e74705SXin Li   return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
2164*67e74705SXin Li }
2165*67e74705SXin Li 
getUsingDecl() const2166*67e74705SXin Li UsingDecl *UsingShadowDecl::getUsingDecl() const {
2167*67e74705SXin Li   const UsingShadowDecl *Shadow = this;
2168*67e74705SXin Li   while (const UsingShadowDecl *NextShadow =
2169*67e74705SXin Li          dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
2170*67e74705SXin Li     Shadow = NextShadow;
2171*67e74705SXin Li   return cast<UsingDecl>(Shadow->UsingOrNextShadow);
2172*67e74705SXin Li }
2173*67e74705SXin Li 
anchor()2174*67e74705SXin Li void ConstructorUsingShadowDecl::anchor() { }
2175*67e74705SXin Li 
2176*67e74705SXin Li ConstructorUsingShadowDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target,bool IsVirtual)2177*67e74705SXin Li ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
2178*67e74705SXin Li                                    SourceLocation Loc, UsingDecl *Using,
2179*67e74705SXin Li                                    NamedDecl *Target, bool IsVirtual) {
2180*67e74705SXin Li   return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
2181*67e74705SXin Li                                                 IsVirtual);
2182*67e74705SXin Li }
2183*67e74705SXin Li 
2184*67e74705SXin Li ConstructorUsingShadowDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2185*67e74705SXin Li ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2186*67e74705SXin Li   return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
2187*67e74705SXin Li }
2188*67e74705SXin Li 
getNominatedBaseClass() const2189*67e74705SXin Li CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
2190*67e74705SXin Li   return getUsingDecl()->getQualifier()->getAsRecordDecl();
2191*67e74705SXin Li }
2192*67e74705SXin Li 
anchor()2193*67e74705SXin Li void UsingDecl::anchor() { }
2194*67e74705SXin Li 
addShadowDecl(UsingShadowDecl * S)2195*67e74705SXin Li void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
2196*67e74705SXin Li   assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
2197*67e74705SXin Li          "declaration already in set");
2198*67e74705SXin Li   assert(S->getUsingDecl() == this);
2199*67e74705SXin Li 
2200*67e74705SXin Li   if (FirstUsingShadow.getPointer())
2201*67e74705SXin Li     S->UsingOrNextShadow = FirstUsingShadow.getPointer();
2202*67e74705SXin Li   FirstUsingShadow.setPointer(S);
2203*67e74705SXin Li }
2204*67e74705SXin Li 
removeShadowDecl(UsingShadowDecl * S)2205*67e74705SXin Li void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
2206*67e74705SXin Li   assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
2207*67e74705SXin Li          "declaration not in set");
2208*67e74705SXin Li   assert(S->getUsingDecl() == this);
2209*67e74705SXin Li 
2210*67e74705SXin Li   // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
2211*67e74705SXin Li 
2212*67e74705SXin Li   if (FirstUsingShadow.getPointer() == S) {
2213*67e74705SXin Li     FirstUsingShadow.setPointer(
2214*67e74705SXin Li       dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
2215*67e74705SXin Li     S->UsingOrNextShadow = this;
2216*67e74705SXin Li     return;
2217*67e74705SXin Li   }
2218*67e74705SXin Li 
2219*67e74705SXin Li   UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
2220*67e74705SXin Li   while (Prev->UsingOrNextShadow != S)
2221*67e74705SXin Li     Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
2222*67e74705SXin Li   Prev->UsingOrNextShadow = S->UsingOrNextShadow;
2223*67e74705SXin Li   S->UsingOrNextShadow = this;
2224*67e74705SXin Li }
2225*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation UL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool HasTypename)2226*67e74705SXin Li UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
2227*67e74705SXin Li                              NestedNameSpecifierLoc QualifierLoc,
2228*67e74705SXin Li                              const DeclarationNameInfo &NameInfo,
2229*67e74705SXin Li                              bool HasTypename) {
2230*67e74705SXin Li   return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
2231*67e74705SXin Li }
2232*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2233*67e74705SXin Li UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2234*67e74705SXin Li   return new (C, ID) UsingDecl(nullptr, SourceLocation(),
2235*67e74705SXin Li                                NestedNameSpecifierLoc(), DeclarationNameInfo(),
2236*67e74705SXin Li                                false);
2237*67e74705SXin Li }
2238*67e74705SXin Li 
getSourceRange() const2239*67e74705SXin Li SourceRange UsingDecl::getSourceRange() const {
2240*67e74705SXin Li   SourceLocation Begin = isAccessDeclaration()
2241*67e74705SXin Li     ? getQualifierLoc().getBeginLoc() : UsingLocation;
2242*67e74705SXin Li   return SourceRange(Begin, getNameInfo().getEndLoc());
2243*67e74705SXin Li }
2244*67e74705SXin Li 
anchor()2245*67e74705SXin Li void UnresolvedUsingValueDecl::anchor() { }
2246*67e74705SXin Li 
2247*67e74705SXin Li UnresolvedUsingValueDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo)2248*67e74705SXin Li UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
2249*67e74705SXin Li                                  SourceLocation UsingLoc,
2250*67e74705SXin Li                                  NestedNameSpecifierLoc QualifierLoc,
2251*67e74705SXin Li                                  const DeclarationNameInfo &NameInfo) {
2252*67e74705SXin Li   return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
2253*67e74705SXin Li                                               QualifierLoc, NameInfo);
2254*67e74705SXin Li }
2255*67e74705SXin Li 
2256*67e74705SXin Li UnresolvedUsingValueDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2257*67e74705SXin Li UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2258*67e74705SXin Li   return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
2259*67e74705SXin Li                                               SourceLocation(),
2260*67e74705SXin Li                                               NestedNameSpecifierLoc(),
2261*67e74705SXin Li                                               DeclarationNameInfo());
2262*67e74705SXin Li }
2263*67e74705SXin Li 
getSourceRange() const2264*67e74705SXin Li SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
2265*67e74705SXin Li   SourceLocation Begin = isAccessDeclaration()
2266*67e74705SXin Li     ? getQualifierLoc().getBeginLoc() : UsingLocation;
2267*67e74705SXin Li   return SourceRange(Begin, getNameInfo().getEndLoc());
2268*67e74705SXin Li }
2269*67e74705SXin Li 
anchor()2270*67e74705SXin Li void UnresolvedUsingTypenameDecl::anchor() { }
2271*67e74705SXin Li 
2272*67e74705SXin Li UnresolvedUsingTypenameDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,SourceLocation TypenameLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TargetNameLoc,DeclarationName TargetName)2273*67e74705SXin Li UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
2274*67e74705SXin Li                                     SourceLocation UsingLoc,
2275*67e74705SXin Li                                     SourceLocation TypenameLoc,
2276*67e74705SXin Li                                     NestedNameSpecifierLoc QualifierLoc,
2277*67e74705SXin Li                                     SourceLocation TargetNameLoc,
2278*67e74705SXin Li                                     DeclarationName TargetName) {
2279*67e74705SXin Li   return new (C, DC) UnresolvedUsingTypenameDecl(
2280*67e74705SXin Li       DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
2281*67e74705SXin Li       TargetName.getAsIdentifierInfo());
2282*67e74705SXin Li }
2283*67e74705SXin Li 
2284*67e74705SXin Li UnresolvedUsingTypenameDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2285*67e74705SXin Li UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2286*67e74705SXin Li   return new (C, ID) UnresolvedUsingTypenameDecl(
2287*67e74705SXin Li       nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
2288*67e74705SXin Li       SourceLocation(), nullptr);
2289*67e74705SXin Li }
2290*67e74705SXin Li 
anchor()2291*67e74705SXin Li void StaticAssertDecl::anchor() { }
2292*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation StaticAssertLoc,Expr * AssertExpr,StringLiteral * Message,SourceLocation RParenLoc,bool Failed)2293*67e74705SXin Li StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
2294*67e74705SXin Li                                            SourceLocation StaticAssertLoc,
2295*67e74705SXin Li                                            Expr *AssertExpr,
2296*67e74705SXin Li                                            StringLiteral *Message,
2297*67e74705SXin Li                                            SourceLocation RParenLoc,
2298*67e74705SXin Li                                            bool Failed) {
2299*67e74705SXin Li   return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
2300*67e74705SXin Li                                       RParenLoc, Failed);
2301*67e74705SXin Li }
2302*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2303*67e74705SXin Li StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
2304*67e74705SXin Li                                                        unsigned ID) {
2305*67e74705SXin Li   return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
2306*67e74705SXin Li                                       nullptr, SourceLocation(), false);
2307*67e74705SXin Li }
2308*67e74705SXin Li 
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName N,QualType T,TypeSourceInfo * TInfo,SourceLocation StartL,IdentifierInfo * Getter,IdentifierInfo * Setter)2309*67e74705SXin Li MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
2310*67e74705SXin Li                                        SourceLocation L, DeclarationName N,
2311*67e74705SXin Li                                        QualType T, TypeSourceInfo *TInfo,
2312*67e74705SXin Li                                        SourceLocation StartL,
2313*67e74705SXin Li                                        IdentifierInfo *Getter,
2314*67e74705SXin Li                                        IdentifierInfo *Setter) {
2315*67e74705SXin Li   return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
2316*67e74705SXin Li }
2317*67e74705SXin Li 
CreateDeserialized(ASTContext & C,unsigned ID)2318*67e74705SXin Li MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
2319*67e74705SXin Li                                                    unsigned ID) {
2320*67e74705SXin Li   return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
2321*67e74705SXin Li                                     DeclarationName(), QualType(), nullptr,
2322*67e74705SXin Li                                     SourceLocation(), nullptr, nullptr);
2323*67e74705SXin Li }
2324*67e74705SXin Li 
getAccessName(AccessSpecifier AS)2325*67e74705SXin Li static const char *getAccessName(AccessSpecifier AS) {
2326*67e74705SXin Li   switch (AS) {
2327*67e74705SXin Li     case AS_none:
2328*67e74705SXin Li       llvm_unreachable("Invalid access specifier!");
2329*67e74705SXin Li     case AS_public:
2330*67e74705SXin Li       return "public";
2331*67e74705SXin Li     case AS_private:
2332*67e74705SXin Li       return "private";
2333*67e74705SXin Li     case AS_protected:
2334*67e74705SXin Li       return "protected";
2335*67e74705SXin Li   }
2336*67e74705SXin Li   llvm_unreachable("Invalid access specifier!");
2337*67e74705SXin Li }
2338*67e74705SXin Li 
operator <<(const DiagnosticBuilder & DB,AccessSpecifier AS)2339*67e74705SXin Li const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
2340*67e74705SXin Li                                            AccessSpecifier AS) {
2341*67e74705SXin Li   return DB << getAccessName(AS);
2342*67e74705SXin Li }
2343*67e74705SXin Li 
operator <<(const PartialDiagnostic & DB,AccessSpecifier AS)2344*67e74705SXin Li const PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB,
2345*67e74705SXin Li                                            AccessSpecifier AS) {
2346*67e74705SXin Li   return DB << getAccessName(AS);
2347*67e74705SXin Li }
2348