1 //===- DeclCXX.cpp - C++ Declaration AST Node Implementation --------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the C++ related Decl classes.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/AST/DeclCXX.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/ASTLambda.h"
16 #include "clang/AST/ASTMutationListener.h"
17 #include "clang/AST/ASTUnresolvedSet.h"
18 #include "clang/AST/Attr.h"
19 #include "clang/AST/CXXInheritance.h"
20 #include "clang/AST/DeclBase.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/DeclarationName.h"
23 #include "clang/AST/Expr.h"
24 #include "clang/AST/ExprCXX.h"
25 #include "clang/AST/LambdaCapture.h"
26 #include "clang/AST/NestedNameSpecifier.h"
27 #include "clang/AST/ODRHash.h"
28 #include "clang/AST/Type.h"
29 #include "clang/AST/TypeLoc.h"
30 #include "clang/AST/UnresolvedSet.h"
31 #include "clang/Basic/Diagnostic.h"
32 #include "clang/Basic/IdentifierTable.h"
33 #include "clang/Basic/LLVM.h"
34 #include "clang/Basic/LangOptions.h"
35 #include "clang/Basic/OperatorKinds.h"
36 #include "clang/Basic/PartialDiagnostic.h"
37 #include "clang/Basic/SourceLocation.h"
38 #include "clang/Basic/Specifiers.h"
39 #include "llvm/ADT/None.h"
40 #include "llvm/ADT/SmallPtrSet.h"
41 #include "llvm/ADT/SmallVector.h"
42 #include "llvm/ADT/iterator_range.h"
43 #include "llvm/Support/Casting.h"
44 #include "llvm/Support/ErrorHandling.h"
45 #include "llvm/Support/Format.h"
46 #include "llvm/Support/raw_ostream.h"
47 #include <algorithm>
48 #include <cassert>
49 #include <cstddef>
50 #include <cstdint>
51 
52 using namespace clang;
53 
54 //===----------------------------------------------------------------------===//
55 // Decl Allocation/Deallocation Method Implementations
56 //===----------------------------------------------------------------------===//
57 
anchor()58 void AccessSpecDecl::anchor() {}
59 
CreateDeserialized(ASTContext & C,unsigned ID)60 AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
61   return new (C, ID) AccessSpecDecl(EmptyShell());
62 }
63 
getFromExternalSource(ASTContext & C) const64 void LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const {
65   ExternalASTSource *Source = C.getExternalSource();
66   assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set");
67   assert(Source && "getFromExternalSource with no external source");
68 
69   for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I)
70     I.setDecl(cast<NamedDecl>(Source->GetExternalDecl(
71         reinterpret_cast<uintptr_t>(I.getDecl()) >> 2)));
72   Impl.Decls.setLazy(false);
73 }
74 
DefinitionData(CXXRecordDecl * D)75 CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
76     : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
77       Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
78       Abstract(false), IsStandardLayout(true), IsCXX11StandardLayout(true),
79       HasBasesWithFields(false), HasBasesWithNonStaticDataMembers(false),
80       HasPrivateFields(false), HasProtectedFields(false),
81       HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
82       HasOnlyCMembers(true), HasInClassInitializer(false),
83       HasUninitializedReferenceMember(false), HasUninitializedFields(false),
84       HasInheritedConstructor(false),
85       HasInheritedDefaultConstructor(false),
86       HasInheritedAssignment(false),
87       NeedOverloadResolutionForCopyConstructor(false),
88       NeedOverloadResolutionForMoveConstructor(false),
89       NeedOverloadResolutionForCopyAssignment(false),
90       NeedOverloadResolutionForMoveAssignment(false),
91       NeedOverloadResolutionForDestructor(false),
92       DefaultedCopyConstructorIsDeleted(false),
93       DefaultedMoveConstructorIsDeleted(false),
94       DefaultedCopyAssignmentIsDeleted(false),
95       DefaultedMoveAssignmentIsDeleted(false),
96       DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
97       HasTrivialSpecialMembersForCall(SMF_All),
98       DeclaredNonTrivialSpecialMembers(0),
99       DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(true),
100       HasConstexprNonCopyMoveConstructor(false),
101       HasDefaultedDefaultConstructor(false),
102       DefaultedDefaultConstructorIsConstexpr(true),
103       HasConstexprDefaultConstructor(false),
104       DefaultedDestructorIsConstexpr(true),
105       HasNonLiteralTypeFieldsOrBases(false), StructuralIfLiteral(true),
106       UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
107       ImplicitCopyConstructorCanHaveConstParamForVBase(true),
108       ImplicitCopyConstructorCanHaveConstParamForNonVBase(true),
109       ImplicitCopyAssignmentHasConstParam(true),
110       HasDeclaredCopyConstructorWithConstParam(false),
111       HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
112       IsParsingBaseSpecifiers(false), ComputedVisibleConversions(false),
113       HasODRHash(false), Definition(D) {}
114 
getBasesSlowCase() const115 CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
116   return Bases.get(Definition->getASTContext().getExternalSource());
117 }
118 
getVBasesSlowCase() const119 CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
120   return VBases.get(Definition->getASTContext().getExternalSource());
121 }
122 
CXXRecordDecl(Kind K,TagKind TK,const ASTContext & C,DeclContext * DC,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,CXXRecordDecl * PrevDecl)123 CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C,
124                              DeclContext *DC, SourceLocation StartLoc,
125                              SourceLocation IdLoc, IdentifierInfo *Id,
126                              CXXRecordDecl *PrevDecl)
127     : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl),
128       DefinitionData(PrevDecl ? PrevDecl->DefinitionData
129                               : nullptr) {}
130 
Create(const ASTContext & C,TagKind TK,DeclContext * DC,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,CXXRecordDecl * PrevDecl,bool DelayTypeCreation)131 CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
132                                      DeclContext *DC, SourceLocation StartLoc,
133                                      SourceLocation IdLoc, IdentifierInfo *Id,
134                                      CXXRecordDecl *PrevDecl,
135                                      bool DelayTypeCreation) {
136   auto *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc, IdLoc, Id,
137                                       PrevDecl);
138   R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
139 
140   // FIXME: DelayTypeCreation seems like such a hack
141   if (!DelayTypeCreation)
142     C.getTypeDeclType(R, PrevDecl);
143   return R;
144 }
145 
146 CXXRecordDecl *
CreateLambda(const ASTContext & C,DeclContext * DC,TypeSourceInfo * Info,SourceLocation Loc,bool Dependent,bool IsGeneric,LambdaCaptureDefault CaptureDefault)147 CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC,
148                             TypeSourceInfo *Info, SourceLocation Loc,
149                             bool Dependent, bool IsGeneric,
150                             LambdaCaptureDefault CaptureDefault) {
151   auto *R = new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc,
152                                       nullptr, nullptr);
153   R->setBeingDefined(true);
154   R->DefinitionData =
155       new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric,
156                                           CaptureDefault);
157   R->setMayHaveOutOfDateDef(false);
158   R->setImplicit(true);
159   C.getTypeDeclType(R, /*PrevDecl=*/nullptr);
160   return R;
161 }
162 
163 CXXRecordDecl *
CreateDeserialized(const ASTContext & C,unsigned ID)164 CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
165   auto *R = new (C, ID) CXXRecordDecl(
166       CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(),
167       nullptr, nullptr);
168   R->setMayHaveOutOfDateDef(false);
169   return R;
170 }
171 
172 /// Determine whether a class has a repeated base class. This is intended for
173 /// use when determining if a class is standard-layout, so makes no attempt to
174 /// handle virtual bases.
hasRepeatedBaseClass(const CXXRecordDecl * StartRD)175 static bool hasRepeatedBaseClass(const CXXRecordDecl *StartRD) {
176   llvm::SmallPtrSet<const CXXRecordDecl*, 8> SeenBaseTypes;
177   SmallVector<const CXXRecordDecl*, 8> WorkList = {StartRD};
178   while (!WorkList.empty()) {
179     const CXXRecordDecl *RD = WorkList.pop_back_val();
180     for (const CXXBaseSpecifier &BaseSpec : RD->bases()) {
181       if (const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
182         if (!SeenBaseTypes.insert(B).second)
183           return true;
184         WorkList.push_back(B);
185       }
186     }
187   }
188   return false;
189 }
190 
191 void
setBases(CXXBaseSpecifier const * const * Bases,unsigned NumBases)192 CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
193                         unsigned NumBases) {
194   ASTContext &C = getASTContext();
195 
196   if (!data().Bases.isOffset() && data().NumBases > 0)
197     C.Deallocate(data().getBases());
198 
199   if (NumBases) {
200     if (!C.getLangOpts().CPlusPlus17) {
201       // C++ [dcl.init.aggr]p1:
202       //   An aggregate is [...] a class with [...] no base classes [...].
203       data().Aggregate = false;
204     }
205 
206     // C++ [class]p4:
207     //   A POD-struct is an aggregate class...
208     data().PlainOldData = false;
209   }
210 
211   // The set of seen virtual base types.
212   llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
213 
214   // The virtual bases of this class.
215   SmallVector<const CXXBaseSpecifier *, 8> VBases;
216 
217   data().Bases = new(C) CXXBaseSpecifier [NumBases];
218   data().NumBases = NumBases;
219   for (unsigned i = 0; i < NumBases; ++i) {
220     data().getBases()[i] = *Bases[i];
221     // Keep track of inherited vbases for this base class.
222     const CXXBaseSpecifier *Base = Bases[i];
223     QualType BaseType = Base->getType();
224     // Skip dependent types; we can't do any checking on them now.
225     if (BaseType->isDependentType())
226       continue;
227     auto *BaseClassDecl =
228         cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl());
229 
230     // C++2a [class]p7:
231     //   A standard-layout class is a class that:
232     //    [...]
233     //    -- has all non-static data members and bit-fields in the class and
234     //       its base classes first declared in the same class
235     if (BaseClassDecl->data().HasBasesWithFields ||
236         !BaseClassDecl->field_empty()) {
237       if (data().HasBasesWithFields)
238         // Two bases have members or bit-fields: not standard-layout.
239         data().IsStandardLayout = false;
240       data().HasBasesWithFields = true;
241     }
242 
243     // C++11 [class]p7:
244     //   A standard-layout class is a class that:
245     //     -- [...] has [...] at most one base class with non-static data
246     //        members
247     if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
248         BaseClassDecl->hasDirectFields()) {
249       if (data().HasBasesWithNonStaticDataMembers)
250         data().IsCXX11StandardLayout = false;
251       data().HasBasesWithNonStaticDataMembers = true;
252     }
253 
254     if (!BaseClassDecl->isEmpty()) {
255       // C++14 [meta.unary.prop]p4:
256       //   T is a class type [...] with [...] no base class B for which
257       //   is_empty<B>::value is false.
258       data().Empty = false;
259     }
260 
261     // C++1z [dcl.init.agg]p1:
262     //   An aggregate is a class with [...] no private or protected base classes
263     if (Base->getAccessSpecifier() != AS_public) {
264       data().Aggregate = false;
265 
266       // C++20 [temp.param]p7:
267       //   A structural type is [...] a literal class type with [...] all base
268       //   classes [...] public
269       data().StructuralIfLiteral = false;
270     }
271 
272     // C++ [class.virtual]p1:
273     //   A class that declares or inherits a virtual function is called a
274     //   polymorphic class.
275     if (BaseClassDecl->isPolymorphic()) {
276       data().Polymorphic = true;
277 
278       //   An aggregate is a class with [...] no virtual functions.
279       data().Aggregate = false;
280     }
281 
282     // C++0x [class]p7:
283     //   A standard-layout class is a class that: [...]
284     //    -- has no non-standard-layout base classes
285     if (!BaseClassDecl->isStandardLayout())
286       data().IsStandardLayout = false;
287     if (!BaseClassDecl->isCXX11StandardLayout())
288       data().IsCXX11StandardLayout = false;
289 
290     // Record if this base is the first non-literal field or base.
291     if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C))
292       data().HasNonLiteralTypeFieldsOrBases = true;
293 
294     // Now go through all virtual bases of this base and add them.
295     for (const auto &VBase : BaseClassDecl->vbases()) {
296       // Add this base if it's not already in the list.
297       if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
298         VBases.push_back(&VBase);
299 
300         // C++11 [class.copy]p8:
301         //   The implicitly-declared copy constructor for a class X will have
302         //   the form 'X::X(const X&)' if each [...] virtual base class B of X
303         //   has a copy constructor whose first parameter is of type
304         //   'const B&' or 'const volatile B&' [...]
305         if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
306           if (!VBaseDecl->hasCopyConstructorWithConstParam())
307             data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
308 
309         // C++1z [dcl.init.agg]p1:
310         //   An aggregate is a class with [...] no virtual base classes
311         data().Aggregate = false;
312       }
313     }
314 
315     if (Base->isVirtual()) {
316       // Add this base if it's not already in the list.
317       if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
318         VBases.push_back(Base);
319 
320       // C++14 [meta.unary.prop] is_empty:
321       //   T is a class type, but not a union type, with ... no virtual base
322       //   classes
323       data().Empty = false;
324 
325       // C++1z [dcl.init.agg]p1:
326       //   An aggregate is a class with [...] no virtual base classes
327       data().Aggregate = false;
328 
329       // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
330       //   A [default constructor, copy/move constructor, or copy/move assignment
331       //   operator for a class X] is trivial [...] if:
332       //    -- class X has [...] no virtual base classes
333       data().HasTrivialSpecialMembers &= SMF_Destructor;
334       data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
335 
336       // C++0x [class]p7:
337       //   A standard-layout class is a class that: [...]
338       //    -- has [...] no virtual base classes
339       data().IsStandardLayout = false;
340       data().IsCXX11StandardLayout = false;
341 
342       // C++20 [dcl.constexpr]p3:
343       //   In the definition of a constexpr function [...]
344       //    -- if the function is a constructor or destructor,
345       //       its class shall not have any virtual base classes
346       data().DefaultedDefaultConstructorIsConstexpr = false;
347       data().DefaultedDestructorIsConstexpr = false;
348 
349       // C++1z [class.copy]p8:
350       //   The implicitly-declared copy constructor for a class X will have
351       //   the form 'X::X(const X&)' if each potentially constructed subobject
352       //   has a copy constructor whose first parameter is of type
353       //   'const B&' or 'const volatile B&' [...]
354       if (!BaseClassDecl->hasCopyConstructorWithConstParam())
355         data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
356     } else {
357       // C++ [class.ctor]p5:
358       //   A default constructor is trivial [...] if:
359       //    -- all the direct base classes of its class have trivial default
360       //       constructors.
361       if (!BaseClassDecl->hasTrivialDefaultConstructor())
362         data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
363 
364       // C++0x [class.copy]p13:
365       //   A copy/move constructor for class X is trivial if [...]
366       //    [...]
367       //    -- the constructor selected to copy/move each direct base class
368       //       subobject is trivial, and
369       if (!BaseClassDecl->hasTrivialCopyConstructor())
370         data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
371 
372       if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
373         data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
374 
375       // If the base class doesn't have a simple move constructor, we'll eagerly
376       // declare it and perform overload resolution to determine which function
377       // it actually calls. If it does have a simple move constructor, this
378       // check is correct.
379       if (!BaseClassDecl->hasTrivialMoveConstructor())
380         data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
381 
382       if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
383         data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
384 
385       // C++0x [class.copy]p27:
386       //   A copy/move assignment operator for class X is trivial if [...]
387       //    [...]
388       //    -- the assignment operator selected to copy/move each direct base
389       //       class subobject is trivial, and
390       if (!BaseClassDecl->hasTrivialCopyAssignment())
391         data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
392       // If the base class doesn't have a simple move assignment, we'll eagerly
393       // declare it and perform overload resolution to determine which function
394       // it actually calls. If it does have a simple move assignment, this
395       // check is correct.
396       if (!BaseClassDecl->hasTrivialMoveAssignment())
397         data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
398 
399       // C++11 [class.ctor]p6:
400       //   If that user-written default constructor would satisfy the
401       //   requirements of a constexpr constructor, the implicitly-defined
402       //   default constructor is constexpr.
403       if (!BaseClassDecl->hasConstexprDefaultConstructor())
404         data().DefaultedDefaultConstructorIsConstexpr = false;
405 
406       // C++1z [class.copy]p8:
407       //   The implicitly-declared copy constructor for a class X will have
408       //   the form 'X::X(const X&)' if each potentially constructed subobject
409       //   has a copy constructor whose first parameter is of type
410       //   'const B&' or 'const volatile B&' [...]
411       if (!BaseClassDecl->hasCopyConstructorWithConstParam())
412         data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
413     }
414 
415     // C++ [class.ctor]p3:
416     //   A destructor is trivial if all the direct base classes of its class
417     //   have trivial destructors.
418     if (!BaseClassDecl->hasTrivialDestructor())
419       data().HasTrivialSpecialMembers &= ~SMF_Destructor;
420 
421     if (!BaseClassDecl->hasTrivialDestructorForCall())
422       data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
423 
424     if (!BaseClassDecl->hasIrrelevantDestructor())
425       data().HasIrrelevantDestructor = false;
426 
427     // C++11 [class.copy]p18:
428     //   The implicitly-declared copy assignment operator for a class X will
429     //   have the form 'X& X::operator=(const X&)' if each direct base class B
430     //   of X has a copy assignment operator whose parameter is of type 'const
431     //   B&', 'const volatile B&', or 'B' [...]
432     if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
433       data().ImplicitCopyAssignmentHasConstParam = false;
434 
435     // A class has an Objective-C object member if... or any of its bases
436     // has an Objective-C object member.
437     if (BaseClassDecl->hasObjectMember())
438       setHasObjectMember(true);
439 
440     if (BaseClassDecl->hasVolatileMember())
441       setHasVolatileMember(true);
442 
443     if (BaseClassDecl->getArgPassingRestrictions() ==
444         RecordDecl::APK_CanNeverPassInRegs)
445       setArgPassingRestrictions(RecordDecl::APK_CanNeverPassInRegs);
446 
447     // Keep track of the presence of mutable fields.
448     if (BaseClassDecl->hasMutableFields())
449       data().HasMutableFields = true;
450 
451     if (BaseClassDecl->hasUninitializedReferenceMember())
452       data().HasUninitializedReferenceMember = true;
453 
454     if (!BaseClassDecl->allowConstDefaultInit())
455       data().HasUninitializedFields = true;
456 
457     addedClassSubobject(BaseClassDecl);
458   }
459 
460   // C++2a [class]p7:
461   //   A class S is a standard-layout class if it:
462   //     -- has at most one base class subobject of any given type
463   //
464   // Note that we only need to check this for classes with more than one base
465   // class. If there's only one base class, and it's standard layout, then
466   // we know there are no repeated base classes.
467   if (data().IsStandardLayout && NumBases > 1 && hasRepeatedBaseClass(this))
468     data().IsStandardLayout = false;
469 
470   if (VBases.empty()) {
471     data().IsParsingBaseSpecifiers = false;
472     return;
473   }
474 
475   // Create base specifier for any direct or indirect virtual bases.
476   data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
477   data().NumVBases = VBases.size();
478   for (int I = 0, E = VBases.size(); I != E; ++I) {
479     QualType Type = VBases[I]->getType();
480     if (!Type->isDependentType())
481       addedClassSubobject(Type->getAsCXXRecordDecl());
482     data().getVBases()[I] = *VBases[I];
483   }
484 
485   data().IsParsingBaseSpecifiers = false;
486 }
487 
getODRHash() const488 unsigned CXXRecordDecl::getODRHash() const {
489   assert(hasDefinition() && "ODRHash only for records with definitions");
490 
491   // Previously calculated hash is stored in DefinitionData.
492   if (DefinitionData->HasODRHash)
493     return DefinitionData->ODRHash;
494 
495   // Only calculate hash on first call of getODRHash per record.
496   ODRHash Hash;
497   Hash.AddCXXRecordDecl(getDefinition());
498   DefinitionData->HasODRHash = true;
499   DefinitionData->ODRHash = Hash.CalculateHash();
500 
501   return DefinitionData->ODRHash;
502 }
503 
addedClassSubobject(CXXRecordDecl * Subobj)504 void CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) {
505   // C++11 [class.copy]p11:
506   //   A defaulted copy/move constructor for a class X is defined as
507   //   deleted if X has:
508   //    -- a direct or virtual base class B that cannot be copied/moved [...]
509   //    -- a non-static data member of class type M (or array thereof)
510   //       that cannot be copied or moved [...]
511   if (!Subobj->hasSimpleCopyConstructor())
512     data().NeedOverloadResolutionForCopyConstructor = true;
513   if (!Subobj->hasSimpleMoveConstructor())
514     data().NeedOverloadResolutionForMoveConstructor = true;
515 
516   // C++11 [class.copy]p23:
517   //   A defaulted copy/move assignment operator for a class X is defined as
518   //   deleted if X has:
519   //    -- a direct or virtual base class B that cannot be copied/moved [...]
520   //    -- a non-static data member of class type M (or array thereof)
521   //        that cannot be copied or moved [...]
522   if (!Subobj->hasSimpleCopyAssignment())
523     data().NeedOverloadResolutionForCopyAssignment = true;
524   if (!Subobj->hasSimpleMoveAssignment())
525     data().NeedOverloadResolutionForMoveAssignment = true;
526 
527   // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5:
528   //   A defaulted [ctor or dtor] for a class X is defined as
529   //   deleted if X has:
530   //    -- any direct or virtual base class [...] has a type with a destructor
531   //       that is deleted or inaccessible from the defaulted [ctor or dtor].
532   //    -- any non-static data member has a type with a destructor
533   //       that is deleted or inaccessible from the defaulted [ctor or dtor].
534   if (!Subobj->hasSimpleDestructor()) {
535     data().NeedOverloadResolutionForCopyConstructor = true;
536     data().NeedOverloadResolutionForMoveConstructor = true;
537     data().NeedOverloadResolutionForDestructor = true;
538   }
539 
540   // C++2a [dcl.constexpr]p4:
541   //   The definition of a constexpr destructor [shall] satisfy the
542   //   following requirement:
543   //   -- for every subobject of class type or (possibly multi-dimensional)
544   //      array thereof, that class type shall have a constexpr destructor
545   if (!Subobj->hasConstexprDestructor())
546     data().DefaultedDestructorIsConstexpr = false;
547 
548   // C++20 [temp.param]p7:
549   //   A structural type is [...] a literal class type [for which] the types
550   //   of all base classes and non-static data members are structural types or
551   //   (possibly multi-dimensional) array thereof
552   if (!Subobj->data().StructuralIfLiteral)
553     data().StructuralIfLiteral = false;
554 }
555 
hasConstexprDestructor() const556 bool CXXRecordDecl::hasConstexprDestructor() const {
557   auto *Dtor = getDestructor();
558   return Dtor ? Dtor->isConstexpr() : defaultedDestructorIsConstexpr();
559 }
560 
hasAnyDependentBases() const561 bool CXXRecordDecl::hasAnyDependentBases() const {
562   if (!isDependentContext())
563     return false;
564 
565   return !forallBases([](const CXXRecordDecl *) { return true; });
566 }
567 
isTriviallyCopyable() const568 bool CXXRecordDecl::isTriviallyCopyable() const {
569   // C++0x [class]p5:
570   //   A trivially copyable class is a class that:
571   //   -- has no non-trivial copy constructors,
572   if (hasNonTrivialCopyConstructor()) return false;
573   //   -- has no non-trivial move constructors,
574   if (hasNonTrivialMoveConstructor()) return false;
575   //   -- has no non-trivial copy assignment operators,
576   if (hasNonTrivialCopyAssignment()) return false;
577   //   -- has no non-trivial move assignment operators, and
578   if (hasNonTrivialMoveAssignment()) return false;
579   //   -- has a trivial destructor.
580   if (!hasTrivialDestructor()) return false;
581 
582   return true;
583 }
584 
markedVirtualFunctionPure()585 void CXXRecordDecl::markedVirtualFunctionPure() {
586   // C++ [class.abstract]p2:
587   //   A class is abstract if it has at least one pure virtual function.
588   data().Abstract = true;
589 }
590 
hasSubobjectAtOffsetZeroOfEmptyBaseType(ASTContext & Ctx,const CXXRecordDecl * XFirst)591 bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
592     ASTContext &Ctx, const CXXRecordDecl *XFirst) {
593   if (!getNumBases())
594     return false;
595 
596   llvm::SmallPtrSet<const CXXRecordDecl*, 8> Bases;
597   llvm::SmallPtrSet<const CXXRecordDecl*, 8> M;
598   SmallVector<const CXXRecordDecl*, 8> WorkList;
599 
600   // Visit a type that we have determined is an element of M(S).
601   auto Visit = [&](const CXXRecordDecl *RD) -> bool {
602     RD = RD->getCanonicalDecl();
603 
604     // C++2a [class]p8:
605     //   A class S is a standard-layout class if it [...] has no element of the
606     //   set M(S) of types as a base class.
607     //
608     // If we find a subobject of an empty type, it might also be a base class,
609     // so we'll need to walk the base classes to check.
610     if (!RD->data().HasBasesWithFields) {
611       // Walk the bases the first time, stopping if we find the type. Build a
612       // set of them so we don't need to walk them again.
613       if (Bases.empty()) {
614         bool RDIsBase = !forallBases([&](const CXXRecordDecl *Base) -> bool {
615           Base = Base->getCanonicalDecl();
616           if (RD == Base)
617             return false;
618           Bases.insert(Base);
619           return true;
620         });
621         if (RDIsBase)
622           return true;
623       } else {
624         if (Bases.count(RD))
625           return true;
626       }
627     }
628 
629     if (M.insert(RD).second)
630       WorkList.push_back(RD);
631     return false;
632   };
633 
634   if (Visit(XFirst))
635     return true;
636 
637   while (!WorkList.empty()) {
638     const CXXRecordDecl *X = WorkList.pop_back_val();
639 
640     // FIXME: We don't check the bases of X. That matches the standard, but
641     // that sure looks like a wording bug.
642 
643     //   -- If X is a non-union class type with a non-static data member
644     //      [recurse to each field] that is either of zero size or is the
645     //      first non-static data member of X
646     //   -- If X is a union type, [recurse to union members]
647     bool IsFirstField = true;
648     for (auto *FD : X->fields()) {
649       // FIXME: Should we really care about the type of the first non-static
650       // data member of a non-union if there are preceding unnamed bit-fields?
651       if (FD->isUnnamedBitfield())
652         continue;
653 
654       if (!IsFirstField && !FD->isZeroSize(Ctx))
655         continue;
656 
657       //   -- If X is n array type, [visit the element type]
658       QualType T = Ctx.getBaseElementType(FD->getType());
659       if (auto *RD = T->getAsCXXRecordDecl())
660         if (Visit(RD))
661           return true;
662 
663       if (!X->isUnion())
664         IsFirstField = false;
665     }
666   }
667 
668   return false;
669 }
670 
lambdaIsDefaultConstructibleAndAssignable() const671 bool CXXRecordDecl::lambdaIsDefaultConstructibleAndAssignable() const {
672   assert(isLambda() && "not a lambda");
673 
674   // C++2a [expr.prim.lambda.capture]p11:
675   //   The closure type associated with a lambda-expression has no default
676   //   constructor if the lambda-expression has a lambda-capture and a
677   //   defaulted default constructor otherwise. It has a deleted copy
678   //   assignment operator if the lambda-expression has a lambda-capture and
679   //   defaulted copy and move assignment operators otherwise.
680   //
681   // C++17 [expr.prim.lambda]p21:
682   //   The closure type associated with a lambda-expression has no default
683   //   constructor and a deleted copy assignment operator.
684   if (getLambdaCaptureDefault() != LCD_None || capture_size() != 0)
685     return false;
686   return getASTContext().getLangOpts().CPlusPlus20;
687 }
688 
addedMember(Decl * D)689 void CXXRecordDecl::addedMember(Decl *D) {
690   if (!D->isImplicit() &&
691       !isa<FieldDecl>(D) &&
692       !isa<IndirectFieldDecl>(D) &&
693       (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class ||
694         cast<TagDecl>(D)->getTagKind() == TTK_Interface))
695     data().HasOnlyCMembers = false;
696 
697   // Ignore friends and invalid declarations.
698   if (D->getFriendObjectKind() || D->isInvalidDecl())
699     return;
700 
701   auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
702   if (FunTmpl)
703     D = FunTmpl->getTemplatedDecl();
704 
705   // FIXME: Pass NamedDecl* to addedMember?
706   Decl *DUnderlying = D;
707   if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
708     DUnderlying = ND->getUnderlyingDecl();
709     if (auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
710       DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
711   }
712 
713   if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
714     if (Method->isVirtual()) {
715       // C++ [dcl.init.aggr]p1:
716       //   An aggregate is an array or a class with [...] no virtual functions.
717       data().Aggregate = false;
718 
719       // C++ [class]p4:
720       //   A POD-struct is an aggregate class...
721       data().PlainOldData = false;
722 
723       // C++14 [meta.unary.prop]p4:
724       //   T is a class type [...] with [...] no virtual member functions...
725       data().Empty = false;
726 
727       // C++ [class.virtual]p1:
728       //   A class that declares or inherits a virtual function is called a
729       //   polymorphic class.
730       data().Polymorphic = true;
731 
732       // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
733       //   A [default constructor, copy/move constructor, or copy/move
734       //   assignment operator for a class X] is trivial [...] if:
735       //    -- class X has no virtual functions [...]
736       data().HasTrivialSpecialMembers &= SMF_Destructor;
737       data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
738 
739       // C++0x [class]p7:
740       //   A standard-layout class is a class that: [...]
741       //    -- has no virtual functions
742       data().IsStandardLayout = false;
743       data().IsCXX11StandardLayout = false;
744     }
745   }
746 
747   // Notify the listener if an implicit member was added after the definition
748   // was completed.
749   if (!isBeingDefined() && D->isImplicit())
750     if (ASTMutationListener *L = getASTMutationListener())
751       L->AddedCXXImplicitMember(data().Definition, D);
752 
753   // The kind of special member this declaration is, if any.
754   unsigned SMKind = 0;
755 
756   // Handle constructors.
757   if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
758     if (Constructor->isInheritingConstructor()) {
759       // Ignore constructor shadow declarations. They are lazily created and
760       // so shouldn't affect any properties of the class.
761     } else {
762       if (!Constructor->isImplicit()) {
763         // Note that we have a user-declared constructor.
764         data().UserDeclaredConstructor = true;
765 
766         // C++ [class]p4:
767         //   A POD-struct is an aggregate class [...]
768         // Since the POD bit is meant to be C++03 POD-ness, clear it even if
769         // the type is technically an aggregate in C++0x since it wouldn't be
770         // in 03.
771         data().PlainOldData = false;
772       }
773 
774       if (Constructor->isDefaultConstructor()) {
775         SMKind |= SMF_DefaultConstructor;
776 
777         if (Constructor->isUserProvided())
778           data().UserProvidedDefaultConstructor = true;
779         if (Constructor->isConstexpr())
780           data().HasConstexprDefaultConstructor = true;
781         if (Constructor->isDefaulted())
782           data().HasDefaultedDefaultConstructor = true;
783       }
784 
785       if (!FunTmpl) {
786         unsigned Quals;
787         if (Constructor->isCopyConstructor(Quals)) {
788           SMKind |= SMF_CopyConstructor;
789 
790           if (Quals & Qualifiers::Const)
791             data().HasDeclaredCopyConstructorWithConstParam = true;
792         } else if (Constructor->isMoveConstructor())
793           SMKind |= SMF_MoveConstructor;
794       }
795 
796       // C++11 [dcl.init.aggr]p1: DR1518
797       //   An aggregate is an array or a class with no user-provided [or]
798       //   explicit [...] constructors
799       // C++20 [dcl.init.aggr]p1:
800       //   An aggregate is an array or a class with no user-declared [...]
801       //   constructors
802       if (getASTContext().getLangOpts().CPlusPlus20
803               ? !Constructor->isImplicit()
804               : (Constructor->isUserProvided() || Constructor->isExplicit()))
805         data().Aggregate = false;
806     }
807   }
808 
809   // Handle constructors, including those inherited from base classes.
810   if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
811     // Record if we see any constexpr constructors which are neither copy
812     // nor move constructors.
813     // C++1z [basic.types]p10:
814     //   [...] has at least one constexpr constructor or constructor template
815     //   (possibly inherited from a base class) that is not a copy or move
816     //   constructor [...]
817     if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor())
818       data().HasConstexprNonCopyMoveConstructor = true;
819     if (!isa<CXXConstructorDecl>(D) && Constructor->isDefaultConstructor())
820       data().HasInheritedDefaultConstructor = true;
821   }
822 
823   // Handle destructors.
824   if (const auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
825     SMKind |= SMF_Destructor;
826 
827     if (DD->isUserProvided())
828       data().HasIrrelevantDestructor = false;
829     // If the destructor is explicitly defaulted and not trivial or not public
830     // or if the destructor is deleted, we clear HasIrrelevantDestructor in
831     // finishedDefaultedOrDeletedMember.
832 
833     // C++11 [class.dtor]p5:
834     //   A destructor is trivial if [...] the destructor is not virtual.
835     if (DD->isVirtual()) {
836       data().HasTrivialSpecialMembers &= ~SMF_Destructor;
837       data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
838     }
839   }
840 
841   // Handle member functions.
842   if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
843     if (Method->isCopyAssignmentOperator()) {
844       SMKind |= SMF_CopyAssignment;
845 
846       const auto *ParamTy =
847           Method->getParamDecl(0)->getType()->getAs<ReferenceType>();
848       if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
849         data().HasDeclaredCopyAssignmentWithConstParam = true;
850     }
851 
852     if (Method->isMoveAssignmentOperator())
853       SMKind |= SMF_MoveAssignment;
854 
855     // Keep the list of conversion functions up-to-date.
856     if (auto *Conversion = dyn_cast<CXXConversionDecl>(D)) {
857       // FIXME: We use the 'unsafe' accessor for the access specifier here,
858       // because Sema may not have set it yet. That's really just a misdesign
859       // in Sema. However, LLDB *will* have set the access specifier correctly,
860       // and adds declarations after the class is technically completed,
861       // so completeDefinition()'s overriding of the access specifiers doesn't
862       // work.
863       AccessSpecifier AS = Conversion->getAccessUnsafe();
864 
865       if (Conversion->getPrimaryTemplate()) {
866         // We don't record specializations.
867       } else {
868         ASTContext &Ctx = getASTContext();
869         ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx);
870         NamedDecl *Primary =
871             FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion);
872         if (Primary->getPreviousDecl())
873           Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()),
874                               Primary, AS);
875         else
876           Conversions.addDecl(Ctx, Primary, AS);
877       }
878     }
879 
880     if (SMKind) {
881       // If this is the first declaration of a special member, we no longer have
882       // an implicit trivial special member.
883       data().HasTrivialSpecialMembers &=
884           data().DeclaredSpecialMembers | ~SMKind;
885       data().HasTrivialSpecialMembersForCall &=
886           data().DeclaredSpecialMembers | ~SMKind;
887 
888       if (!Method->isImplicit() && !Method->isUserProvided()) {
889         // This method is user-declared but not user-provided. We can't work out
890         // whether it's trivial yet (not until we get to the end of the class).
891         // We'll handle this method in finishedDefaultedOrDeletedMember.
892       } else if (Method->isTrivial()) {
893         data().HasTrivialSpecialMembers |= SMKind;
894         data().HasTrivialSpecialMembersForCall |= SMKind;
895       } else if (Method->isTrivialForCall()) {
896         data().HasTrivialSpecialMembersForCall |= SMKind;
897         data().DeclaredNonTrivialSpecialMembers |= SMKind;
898       } else {
899         data().DeclaredNonTrivialSpecialMembers |= SMKind;
900         // If this is a user-provided function, do not set
901         // DeclaredNonTrivialSpecialMembersForCall here since we don't know
902         // yet whether the method would be considered non-trivial for the
903         // purpose of calls (attribute "trivial_abi" can be dropped from the
904         // class later, which can change the special method's triviality).
905         if (!Method->isUserProvided())
906           data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
907       }
908 
909       // Note when we have declared a declared special member, and suppress the
910       // implicit declaration of this special member.
911       data().DeclaredSpecialMembers |= SMKind;
912 
913       if (!Method->isImplicit()) {
914         data().UserDeclaredSpecialMembers |= SMKind;
915 
916         // C++03 [class]p4:
917         //   A POD-struct is an aggregate class that has [...] no user-defined
918         //   copy assignment operator and no user-defined destructor.
919         //
920         // Since the POD bit is meant to be C++03 POD-ness, and in C++03,
921         // aggregates could not have any constructors, clear it even for an
922         // explicitly defaulted or deleted constructor.
923         // type is technically an aggregate in C++0x since it wouldn't be in 03.
924         //
925         // Also, a user-declared move assignment operator makes a class non-POD.
926         // This is an extension in C++03.
927         data().PlainOldData = false;
928       }
929     }
930 
931     return;
932   }
933 
934   // Handle non-static data members.
935   if (const auto *Field = dyn_cast<FieldDecl>(D)) {
936     ASTContext &Context = getASTContext();
937 
938     // C++2a [class]p7:
939     //   A standard-layout class is a class that:
940     //    [...]
941     //    -- has all non-static data members and bit-fields in the class and
942     //       its base classes first declared in the same class
943     if (data().HasBasesWithFields)
944       data().IsStandardLayout = false;
945 
946     // C++ [class.bit]p2:
947     //   A declaration for a bit-field that omits the identifier declares an
948     //   unnamed bit-field. Unnamed bit-fields are not members and cannot be
949     //   initialized.
950     if (Field->isUnnamedBitfield()) {
951       // C++ [meta.unary.prop]p4: [LWG2358]
952       //   T is a class type [...] with [...] no unnamed bit-fields of non-zero
953       //   length
954       if (data().Empty && !Field->isZeroLengthBitField(Context) &&
955           Context.getLangOpts().getClangABICompat() >
956               LangOptions::ClangABI::Ver6)
957         data().Empty = false;
958       return;
959     }
960 
961     // C++11 [class]p7:
962     //   A standard-layout class is a class that:
963     //    -- either has no non-static data members in the most derived class
964     //       [...] or has no base classes with non-static data members
965     if (data().HasBasesWithNonStaticDataMembers)
966       data().IsCXX11StandardLayout = false;
967 
968     // C++ [dcl.init.aggr]p1:
969     //   An aggregate is an array or a class (clause 9) with [...] no
970     //   private or protected non-static data members (clause 11).
971     //
972     // A POD must be an aggregate.
973     if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
974       data().Aggregate = false;
975       data().PlainOldData = false;
976 
977       // C++20 [temp.param]p7:
978       //   A structural type is [...] a literal class type [for which] all
979       //   non-static data members are public
980       data().StructuralIfLiteral = false;
981     }
982 
983     // Track whether this is the first field. We use this when checking
984     // whether the class is standard-layout below.
985     bool IsFirstField = !data().HasPrivateFields &&
986                         !data().HasProtectedFields && !data().HasPublicFields;
987 
988     // C++0x [class]p7:
989     //   A standard-layout class is a class that:
990     //    [...]
991     //    -- has the same access control for all non-static data members,
992     switch (D->getAccess()) {
993     case AS_private:    data().HasPrivateFields = true;   break;
994     case AS_protected:  data().HasProtectedFields = true; break;
995     case AS_public:     data().HasPublicFields = true;    break;
996     case AS_none:       llvm_unreachable("Invalid access specifier");
997     };
998     if ((data().HasPrivateFields + data().HasProtectedFields +
999          data().HasPublicFields) > 1) {
1000       data().IsStandardLayout = false;
1001       data().IsCXX11StandardLayout = false;
1002     }
1003 
1004     // Keep track of the presence of mutable fields.
1005     if (Field->isMutable()) {
1006       data().HasMutableFields = true;
1007 
1008       // C++20 [temp.param]p7:
1009       //   A structural type is [...] a literal class type [for which] all
1010       //   non-static data members are public
1011       data().StructuralIfLiteral = false;
1012     }
1013 
1014     // C++11 [class.union]p8, DR1460:
1015     //   If X is a union, a non-static data member of X that is not an anonymous
1016     //   union is a variant member of X.
1017     if (isUnion() && !Field->isAnonymousStructOrUnion())
1018       data().HasVariantMembers = true;
1019 
1020     // C++0x [class]p9:
1021     //   A POD struct is a class that is both a trivial class and a
1022     //   standard-layout class, and has no non-static data members of type
1023     //   non-POD struct, non-POD union (or array of such types).
1024     //
1025     // Automatic Reference Counting: the presence of a member of Objective-C pointer type
1026     // that does not explicitly have no lifetime makes the class a non-POD.
1027     QualType T = Context.getBaseElementType(Field->getType());
1028     if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
1029       if (T.hasNonTrivialObjCLifetime()) {
1030         // Objective-C Automatic Reference Counting:
1031         //   If a class has a non-static data member of Objective-C pointer
1032         //   type (or array thereof), it is a non-POD type and its
1033         //   default constructor (if any), copy constructor, move constructor,
1034         //   copy assignment operator, move assignment operator, and destructor are
1035         //   non-trivial.
1036         setHasObjectMember(true);
1037         struct DefinitionData &Data = data();
1038         Data.PlainOldData = false;
1039         Data.HasTrivialSpecialMembers = 0;
1040 
1041         // __strong or __weak fields do not make special functions non-trivial
1042         // for the purpose of calls.
1043         Qualifiers::ObjCLifetime LT = T.getQualifiers().getObjCLifetime();
1044         if (LT != Qualifiers::OCL_Strong && LT != Qualifiers::OCL_Weak)
1045           data().HasTrivialSpecialMembersForCall = 0;
1046 
1047         // Structs with __weak fields should never be passed directly.
1048         if (LT == Qualifiers::OCL_Weak)
1049           setArgPassingRestrictions(RecordDecl::APK_CanNeverPassInRegs);
1050 
1051         Data.HasIrrelevantDestructor = false;
1052 
1053         if (isUnion()) {
1054           data().DefaultedCopyConstructorIsDeleted = true;
1055           data().DefaultedMoveConstructorIsDeleted = true;
1056           data().DefaultedCopyAssignmentIsDeleted = true;
1057           data().DefaultedMoveAssignmentIsDeleted = true;
1058           data().DefaultedDestructorIsDeleted = true;
1059           data().NeedOverloadResolutionForCopyConstructor = true;
1060           data().NeedOverloadResolutionForMoveConstructor = true;
1061           data().NeedOverloadResolutionForCopyAssignment = true;
1062           data().NeedOverloadResolutionForMoveAssignment = true;
1063           data().NeedOverloadResolutionForDestructor = true;
1064         }
1065       } else if (!Context.getLangOpts().ObjCAutoRefCount) {
1066         setHasObjectMember(true);
1067       }
1068     } else if (!T.isCXX98PODType(Context))
1069       data().PlainOldData = false;
1070 
1071     if (T->isReferenceType()) {
1072       if (!Field->hasInClassInitializer())
1073         data().HasUninitializedReferenceMember = true;
1074 
1075       // C++0x [class]p7:
1076       //   A standard-layout class is a class that:
1077       //    -- has no non-static data members of type [...] reference,
1078       data().IsStandardLayout = false;
1079       data().IsCXX11StandardLayout = false;
1080 
1081       // C++1z [class.copy.ctor]p10:
1082       //   A defaulted copy constructor for a class X is defined as deleted if X has:
1083       //    -- a non-static data member of rvalue reference type
1084       if (T->isRValueReferenceType())
1085         data().DefaultedCopyConstructorIsDeleted = true;
1086     }
1087 
1088     if (!Field->hasInClassInitializer() && !Field->isMutable()) {
1089       if (CXXRecordDecl *FieldType = T->getAsCXXRecordDecl()) {
1090         if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1091           data().HasUninitializedFields = true;
1092       } else {
1093         data().HasUninitializedFields = true;
1094       }
1095     }
1096 
1097     // Record if this field is the first non-literal or volatile field or base.
1098     if (!T->isLiteralType(Context) || T.isVolatileQualified())
1099       data().HasNonLiteralTypeFieldsOrBases = true;
1100 
1101     if (Field->hasInClassInitializer() ||
1102         (Field->isAnonymousStructOrUnion() &&
1103          Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1104       data().HasInClassInitializer = true;
1105 
1106       // C++11 [class]p5:
1107       //   A default constructor is trivial if [...] no non-static data member
1108       //   of its class has a brace-or-equal-initializer.
1109       data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1110 
1111       // C++11 [dcl.init.aggr]p1:
1112       //   An aggregate is a [...] class with [...] no
1113       //   brace-or-equal-initializers for non-static data members.
1114       //
1115       // This rule was removed in C++14.
1116       if (!getASTContext().getLangOpts().CPlusPlus14)
1117         data().Aggregate = false;
1118 
1119       // C++11 [class]p10:
1120       //   A POD struct is [...] a trivial class.
1121       data().PlainOldData = false;
1122     }
1123 
1124     // C++11 [class.copy]p23:
1125     //   A defaulted copy/move assignment operator for a class X is defined
1126     //   as deleted if X has:
1127     //    -- a non-static data member of reference type
1128     if (T->isReferenceType()) {
1129       data().DefaultedCopyAssignmentIsDeleted = true;
1130       data().DefaultedMoveAssignmentIsDeleted = true;
1131     }
1132 
1133     // Bitfields of length 0 are also zero-sized, but we already bailed out for
1134     // those because they are always unnamed.
1135     bool IsZeroSize = Field->isZeroSize(Context);
1136 
1137     if (const auto *RecordTy = T->getAs<RecordType>()) {
1138       auto *FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
1139       if (FieldRec->getDefinition()) {
1140         addedClassSubobject(FieldRec);
1141 
1142         // We may need to perform overload resolution to determine whether a
1143         // field can be moved if it's const or volatile qualified.
1144         if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) {
1145           // We need to care about 'const' for the copy constructor because an
1146           // implicit copy constructor might be declared with a non-const
1147           // parameter.
1148           data().NeedOverloadResolutionForCopyConstructor = true;
1149           data().NeedOverloadResolutionForMoveConstructor = true;
1150           data().NeedOverloadResolutionForCopyAssignment = true;
1151           data().NeedOverloadResolutionForMoveAssignment = true;
1152         }
1153 
1154         // C++11 [class.ctor]p5, C++11 [class.copy]p11:
1155         //   A defaulted [special member] for a class X is defined as
1156         //   deleted if:
1157         //    -- X is a union-like class that has a variant member with a
1158         //       non-trivial [corresponding special member]
1159         if (isUnion()) {
1160           if (FieldRec->hasNonTrivialCopyConstructor())
1161             data().DefaultedCopyConstructorIsDeleted = true;
1162           if (FieldRec->hasNonTrivialMoveConstructor())
1163             data().DefaultedMoveConstructorIsDeleted = true;
1164           if (FieldRec->hasNonTrivialCopyAssignment())
1165             data().DefaultedCopyAssignmentIsDeleted = true;
1166           if (FieldRec->hasNonTrivialMoveAssignment())
1167             data().DefaultedMoveAssignmentIsDeleted = true;
1168           if (FieldRec->hasNonTrivialDestructor())
1169             data().DefaultedDestructorIsDeleted = true;
1170         }
1171 
1172         // For an anonymous union member, our overload resolution will perform
1173         // overload resolution for its members.
1174         if (Field->isAnonymousStructOrUnion()) {
1175           data().NeedOverloadResolutionForCopyConstructor |=
1176               FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1177           data().NeedOverloadResolutionForMoveConstructor |=
1178               FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1179           data().NeedOverloadResolutionForCopyAssignment |=
1180               FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1181           data().NeedOverloadResolutionForMoveAssignment |=
1182               FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1183           data().NeedOverloadResolutionForDestructor |=
1184               FieldRec->data().NeedOverloadResolutionForDestructor;
1185         }
1186 
1187         // C++0x [class.ctor]p5:
1188         //   A default constructor is trivial [...] if:
1189         //    -- for all the non-static data members of its class that are of
1190         //       class type (or array thereof), each such class has a trivial
1191         //       default constructor.
1192         if (!FieldRec->hasTrivialDefaultConstructor())
1193           data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1194 
1195         // C++0x [class.copy]p13:
1196         //   A copy/move constructor for class X is trivial if [...]
1197         //    [...]
1198         //    -- for each non-static data member of X that is of class type (or
1199         //       an array thereof), the constructor selected to copy/move that
1200         //       member is trivial;
1201         if (!FieldRec->hasTrivialCopyConstructor())
1202           data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1203 
1204         if (!FieldRec->hasTrivialCopyConstructorForCall())
1205           data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1206 
1207         // If the field doesn't have a simple move constructor, we'll eagerly
1208         // declare the move constructor for this class and we'll decide whether
1209         // it's trivial then.
1210         if (!FieldRec->hasTrivialMoveConstructor())
1211           data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1212 
1213         if (!FieldRec->hasTrivialMoveConstructorForCall())
1214           data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1215 
1216         // C++0x [class.copy]p27:
1217         //   A copy/move assignment operator for class X is trivial if [...]
1218         //    [...]
1219         //    -- for each non-static data member of X that is of class type (or
1220         //       an array thereof), the assignment operator selected to
1221         //       copy/move that member is trivial;
1222         if (!FieldRec->hasTrivialCopyAssignment())
1223           data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1224         // If the field doesn't have a simple move assignment, we'll eagerly
1225         // declare the move assignment for this class and we'll decide whether
1226         // it's trivial then.
1227         if (!FieldRec->hasTrivialMoveAssignment())
1228           data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1229 
1230         if (!FieldRec->hasTrivialDestructor())
1231           data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1232         if (!FieldRec->hasTrivialDestructorForCall())
1233           data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1234         if (!FieldRec->hasIrrelevantDestructor())
1235           data().HasIrrelevantDestructor = false;
1236         if (FieldRec->hasObjectMember())
1237           setHasObjectMember(true);
1238         if (FieldRec->hasVolatileMember())
1239           setHasVolatileMember(true);
1240         if (FieldRec->getArgPassingRestrictions() ==
1241             RecordDecl::APK_CanNeverPassInRegs)
1242           setArgPassingRestrictions(RecordDecl::APK_CanNeverPassInRegs);
1243 
1244         // C++0x [class]p7:
1245         //   A standard-layout class is a class that:
1246         //    -- has no non-static data members of type non-standard-layout
1247         //       class (or array of such types) [...]
1248         if (!FieldRec->isStandardLayout())
1249           data().IsStandardLayout = false;
1250         if (!FieldRec->isCXX11StandardLayout())
1251           data().IsCXX11StandardLayout = false;
1252 
1253         // C++2a [class]p7:
1254         //   A standard-layout class is a class that:
1255         //    [...]
1256         //    -- has no element of the set M(S) of types as a base class.
1257         if (data().IsStandardLayout &&
1258             (isUnion() || IsFirstField || IsZeroSize) &&
1259             hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1260           data().IsStandardLayout = false;
1261 
1262         // C++11 [class]p7:
1263         //   A standard-layout class is a class that:
1264         //    -- has no base classes of the same type as the first non-static
1265         //       data member
1266         if (data().IsCXX11StandardLayout && IsFirstField) {
1267           // FIXME: We should check all base classes here, not just direct
1268           // base classes.
1269           for (const auto &BI : bases()) {
1270             if (Context.hasSameUnqualifiedType(BI.getType(), T)) {
1271               data().IsCXX11StandardLayout = false;
1272               break;
1273             }
1274           }
1275         }
1276 
1277         // Keep track of the presence of mutable fields.
1278         if (FieldRec->hasMutableFields())
1279           data().HasMutableFields = true;
1280 
1281         if (Field->isMutable()) {
1282           // Our copy constructor/assignment might call something other than
1283           // the subobject's copy constructor/assignment if it's mutable and of
1284           // class type.
1285           data().NeedOverloadResolutionForCopyConstructor = true;
1286           data().NeedOverloadResolutionForCopyAssignment = true;
1287         }
1288 
1289         // C++11 [class.copy]p13:
1290         //   If the implicitly-defined constructor would satisfy the
1291         //   requirements of a constexpr constructor, the implicitly-defined
1292         //   constructor is constexpr.
1293         // C++11 [dcl.constexpr]p4:
1294         //    -- every constructor involved in initializing non-static data
1295         //       members [...] shall be a constexpr constructor
1296         if (!Field->hasInClassInitializer() &&
1297             !FieldRec->hasConstexprDefaultConstructor() && !isUnion())
1298           // The standard requires any in-class initializer to be a constant
1299           // expression. We consider this to be a defect.
1300           data().DefaultedDefaultConstructorIsConstexpr = false;
1301 
1302         // C++11 [class.copy]p8:
1303         //   The implicitly-declared copy constructor for a class X will have
1304         //   the form 'X::X(const X&)' if each potentially constructed subobject
1305         //   of a class type M (or array thereof) has a copy constructor whose
1306         //   first parameter is of type 'const M&' or 'const volatile M&'.
1307         if (!FieldRec->hasCopyConstructorWithConstParam())
1308           data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
1309 
1310         // C++11 [class.copy]p18:
1311         //   The implicitly-declared copy assignment oeprator for a class X will
1312         //   have the form 'X& X::operator=(const X&)' if [...] for all the
1313         //   non-static data members of X that are of a class type M (or array
1314         //   thereof), each such class type has a copy assignment operator whose
1315         //   parameter is of type 'const M&', 'const volatile M&' or 'M'.
1316         if (!FieldRec->hasCopyAssignmentWithConstParam())
1317           data().ImplicitCopyAssignmentHasConstParam = false;
1318 
1319         if (FieldRec->hasUninitializedReferenceMember() &&
1320             !Field->hasInClassInitializer())
1321           data().HasUninitializedReferenceMember = true;
1322 
1323         // C++11 [class.union]p8, DR1460:
1324         //   a non-static data member of an anonymous union that is a member of
1325         //   X is also a variant member of X.
1326         if (FieldRec->hasVariantMembers() &&
1327             Field->isAnonymousStructOrUnion())
1328           data().HasVariantMembers = true;
1329       }
1330     } else {
1331       // Base element type of field is a non-class type.
1332       if (!T->isLiteralType(Context) ||
1333           (!Field->hasInClassInitializer() && !isUnion() &&
1334            !Context.getLangOpts().CPlusPlus20))
1335         data().DefaultedDefaultConstructorIsConstexpr = false;
1336 
1337       // C++11 [class.copy]p23:
1338       //   A defaulted copy/move assignment operator for a class X is defined
1339       //   as deleted if X has:
1340       //    -- a non-static data member of const non-class type (or array
1341       //       thereof)
1342       if (T.isConstQualified()) {
1343         data().DefaultedCopyAssignmentIsDeleted = true;
1344         data().DefaultedMoveAssignmentIsDeleted = true;
1345       }
1346 
1347       // C++20 [temp.param]p7:
1348       //   A structural type is [...] a literal class type [for which] the
1349       //   types of all non-static data members are structural types or
1350       //   (possibly multidimensional) array thereof
1351       // We deal with class types elsewhere.
1352       if (!T->isStructuralType())
1353         data().StructuralIfLiteral = false;
1354     }
1355 
1356     // C++14 [meta.unary.prop]p4:
1357     //   T is a class type [...] with [...] no non-static data members other
1358     //   than subobjects of zero size
1359     if (data().Empty && !IsZeroSize)
1360       data().Empty = false;
1361   }
1362 
1363   // Handle using declarations of conversion functions.
1364   if (auto *Shadow = dyn_cast<UsingShadowDecl>(D)) {
1365     if (Shadow->getDeclName().getNameKind()
1366           == DeclarationName::CXXConversionFunctionName) {
1367       ASTContext &Ctx = getASTContext();
1368       data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1369     }
1370   }
1371 
1372   if (const auto *Using = dyn_cast<UsingDecl>(D)) {
1373     if (Using->getDeclName().getNameKind() ==
1374         DeclarationName::CXXConstructorName) {
1375       data().HasInheritedConstructor = true;
1376       // C++1z [dcl.init.aggr]p1:
1377       //  An aggregate is [...] a class [...] with no inherited constructors
1378       data().Aggregate = false;
1379     }
1380 
1381     if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1382       data().HasInheritedAssignment = true;
1383   }
1384 }
1385 
finishedDefaultedOrDeletedMember(CXXMethodDecl * D)1386 void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) {
1387   assert(!D->isImplicit() && !D->isUserProvided());
1388 
1389   // The kind of special member this declaration is, if any.
1390   unsigned SMKind = 0;
1391 
1392   if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1393     if (Constructor->isDefaultConstructor()) {
1394       SMKind |= SMF_DefaultConstructor;
1395       if (Constructor->isConstexpr())
1396         data().HasConstexprDefaultConstructor = true;
1397     }
1398     if (Constructor->isCopyConstructor())
1399       SMKind |= SMF_CopyConstructor;
1400     else if (Constructor->isMoveConstructor())
1401       SMKind |= SMF_MoveConstructor;
1402     else if (Constructor->isConstexpr())
1403       // We may now know that the constructor is constexpr.
1404       data().HasConstexprNonCopyMoveConstructor = true;
1405   } else if (isa<CXXDestructorDecl>(D)) {
1406     SMKind |= SMF_Destructor;
1407     if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted())
1408       data().HasIrrelevantDestructor = false;
1409   } else if (D->isCopyAssignmentOperator())
1410     SMKind |= SMF_CopyAssignment;
1411   else if (D->isMoveAssignmentOperator())
1412     SMKind |= SMF_MoveAssignment;
1413 
1414   // Update which trivial / non-trivial special members we have.
1415   // addedMember will have skipped this step for this member.
1416   if (D->isTrivial())
1417     data().HasTrivialSpecialMembers |= SMKind;
1418   else
1419     data().DeclaredNonTrivialSpecialMembers |= SMKind;
1420 }
1421 
setCaptures(ASTContext & Context,ArrayRef<LambdaCapture> Captures)1422 void CXXRecordDecl::setCaptures(ASTContext &Context,
1423                                 ArrayRef<LambdaCapture> Captures) {
1424   CXXRecordDecl::LambdaDefinitionData &Data = getLambdaData();
1425 
1426   // Copy captures.
1427   Data.NumCaptures = Captures.size();
1428   Data.NumExplicitCaptures = 0;
1429   Data.Captures = (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) *
1430                                                     Captures.size());
1431   LambdaCapture *ToCapture = Data.Captures;
1432   for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
1433     if (Captures[I].isExplicit())
1434       ++Data.NumExplicitCaptures;
1435 
1436     *ToCapture++ = Captures[I];
1437   }
1438 
1439   if (!lambdaIsDefaultConstructibleAndAssignable())
1440     Data.DefaultedCopyAssignmentIsDeleted = true;
1441 }
1442 
setTrivialForCallFlags(CXXMethodDecl * D)1443 void CXXRecordDecl::setTrivialForCallFlags(CXXMethodDecl *D) {
1444   unsigned SMKind = 0;
1445 
1446   if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1447     if (Constructor->isCopyConstructor())
1448       SMKind = SMF_CopyConstructor;
1449     else if (Constructor->isMoveConstructor())
1450       SMKind = SMF_MoveConstructor;
1451   } else if (isa<CXXDestructorDecl>(D))
1452     SMKind = SMF_Destructor;
1453 
1454   if (D->isTrivialForCall())
1455     data().HasTrivialSpecialMembersForCall |= SMKind;
1456   else
1457     data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1458 }
1459 
isCLike() const1460 bool CXXRecordDecl::isCLike() const {
1461   if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface ||
1462       !TemplateOrInstantiation.isNull())
1463     return false;
1464   if (!hasDefinition())
1465     return true;
1466 
1467   return isPOD() && data().HasOnlyCMembers;
1468 }
1469 
isGenericLambda() const1470 bool CXXRecordDecl::isGenericLambda() const {
1471   if (!isLambda()) return false;
1472   return getLambdaData().IsGenericLambda;
1473 }
1474 
1475 #ifndef NDEBUG
allLookupResultsAreTheSame(const DeclContext::lookup_result & R)1476 static bool allLookupResultsAreTheSame(const DeclContext::lookup_result &R) {
1477   for (auto *D : R)
1478     if (!declaresSameEntity(D, R.front()))
1479       return false;
1480   return true;
1481 }
1482 #endif
1483 
getLambdaCallOperatorHelper(const CXXRecordDecl & RD)1484 static NamedDecl* getLambdaCallOperatorHelper(const CXXRecordDecl &RD) {
1485   if (!RD.isLambda()) return nullptr;
1486   DeclarationName Name =
1487     RD.getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
1488   DeclContext::lookup_result Calls = RD.lookup(Name);
1489 
1490   assert(!Calls.empty() && "Missing lambda call operator!");
1491   assert(allLookupResultsAreTheSame(Calls) &&
1492          "More than one lambda call operator!");
1493   return Calls.front();
1494 }
1495 
getDependentLambdaCallOperator() const1496 FunctionTemplateDecl* CXXRecordDecl::getDependentLambdaCallOperator() const {
1497   NamedDecl *CallOp = getLambdaCallOperatorHelper(*this);
1498   return  dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1499 }
1500 
getLambdaCallOperator() const1501 CXXMethodDecl *CXXRecordDecl::getLambdaCallOperator() const {
1502   NamedDecl *CallOp = getLambdaCallOperatorHelper(*this);
1503 
1504   if (CallOp == nullptr)
1505     return nullptr;
1506 
1507   if (const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1508     return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1509 
1510   return cast<CXXMethodDecl>(CallOp);
1511 }
1512 
getLambdaStaticInvoker() const1513 CXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const {
1514   CXXMethodDecl *CallOp = getLambdaCallOperator();
1515   CallingConv CC = CallOp->getType()->castAs<FunctionType>()->getCallConv();
1516   return getLambdaStaticInvoker(CC);
1517 }
1518 
1519 static DeclContext::lookup_result
getLambdaStaticInvokers(const CXXRecordDecl & RD)1520 getLambdaStaticInvokers(const CXXRecordDecl &RD) {
1521   assert(RD.isLambda() && "Must be a lambda");
1522   DeclarationName Name =
1523       &RD.getASTContext().Idents.get(getLambdaStaticInvokerName());
1524   return RD.lookup(Name);
1525 }
1526 
getInvokerAsMethod(NamedDecl * ND)1527 static CXXMethodDecl *getInvokerAsMethod(NamedDecl *ND) {
1528   if (const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1529     return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1530   return cast<CXXMethodDecl>(ND);
1531 }
1532 
getLambdaStaticInvoker(CallingConv CC) const1533 CXXMethodDecl *CXXRecordDecl::getLambdaStaticInvoker(CallingConv CC) const {
1534   if (!isLambda())
1535     return nullptr;
1536   DeclContext::lookup_result Invoker = getLambdaStaticInvokers(*this);
1537 
1538   for (NamedDecl *ND : Invoker) {
1539     const auto *FTy =
1540         cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<FunctionType>();
1541     if (FTy->getCallConv() == CC)
1542       return getInvokerAsMethod(ND);
1543   }
1544 
1545   return nullptr;
1546 }
1547 
getCaptureFields(llvm::DenseMap<const VarDecl *,FieldDecl * > & Captures,FieldDecl * & ThisCapture) const1548 void CXXRecordDecl::getCaptureFields(
1549        llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
1550        FieldDecl *&ThisCapture) const {
1551   Captures.clear();
1552   ThisCapture = nullptr;
1553 
1554   LambdaDefinitionData &Lambda = getLambdaData();
1555   RecordDecl::field_iterator Field = field_begin();
1556   for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures;
1557        C != CEnd; ++C, ++Field) {
1558     if (C->capturesThis())
1559       ThisCapture = *Field;
1560     else if (C->capturesVariable())
1561       Captures[C->getCapturedVar()] = *Field;
1562   }
1563   assert(Field == field_end());
1564 }
1565 
1566 TemplateParameterList *
getGenericLambdaTemplateParameterList() const1567 CXXRecordDecl::getGenericLambdaTemplateParameterList() const {
1568   if (!isGenericLambda()) return nullptr;
1569   CXXMethodDecl *CallOp = getLambdaCallOperator();
1570   if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate())
1571     return Tmpl->getTemplateParameters();
1572   return nullptr;
1573 }
1574 
1575 ArrayRef<NamedDecl *>
getLambdaExplicitTemplateParameters() const1576 CXXRecordDecl::getLambdaExplicitTemplateParameters() const {
1577   TemplateParameterList *List = getGenericLambdaTemplateParameterList();
1578   if (!List)
1579     return {};
1580 
1581   assert(std::is_partitioned(List->begin(), List->end(),
1582                              [](const NamedDecl *D) { return !D->isImplicit(); })
1583          && "Explicit template params should be ordered before implicit ones");
1584 
1585   const auto ExplicitEnd = llvm::partition_point(
1586       *List, [](const NamedDecl *D) { return !D->isImplicit(); });
1587   return llvm::makeArrayRef(List->begin(), ExplicitEnd);
1588 }
1589 
getLambdaContextDecl() const1590 Decl *CXXRecordDecl::getLambdaContextDecl() const {
1591   assert(isLambda() && "Not a lambda closure type!");
1592   ExternalASTSource *Source = getParentASTContext().getExternalSource();
1593   return getLambdaData().ContextDecl.get(Source);
1594 }
1595 
setDeviceLambdaManglingNumber(unsigned Num) const1596 void CXXRecordDecl::setDeviceLambdaManglingNumber(unsigned Num) const {
1597   assert(isLambda() && "Not a lambda closure type!");
1598   if (Num)
1599     getASTContext().DeviceLambdaManglingNumbers[this] = Num;
1600 }
1601 
getDeviceLambdaManglingNumber() const1602 unsigned CXXRecordDecl::getDeviceLambdaManglingNumber() const {
1603   assert(isLambda() && "Not a lambda closure type!");
1604   auto I = getASTContext().DeviceLambdaManglingNumbers.find(this);
1605   if (I != getASTContext().DeviceLambdaManglingNumbers.end())
1606     return I->second;
1607   return 0;
1608 }
1609 
GetConversionType(ASTContext & Context,NamedDecl * Conv)1610 static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
1611   QualType T =
1612       cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1613           ->getConversionType();
1614   return Context.getCanonicalType(T);
1615 }
1616 
1617 /// Collect the visible conversions of a base class.
1618 ///
1619 /// \param Record a base class of the class we're considering
1620 /// \param InVirtual whether this base class is a virtual base (or a base
1621 ///   of a virtual base)
1622 /// \param Access the access along the inheritance path to this base
1623 /// \param ParentHiddenTypes the conversions provided by the inheritors
1624 ///   of this base
1625 /// \param Output the set to which to add conversions from non-virtual bases
1626 /// \param VOutput the set to which to add conversions from virtual bases
1627 /// \param HiddenVBaseCs the set of conversions which were hidden in a
1628 ///   virtual base along some inheritance path
CollectVisibleConversions(ASTContext & Context,const CXXRecordDecl * Record,bool InVirtual,AccessSpecifier Access,const llvm::SmallPtrSet<CanQualType,8> & ParentHiddenTypes,ASTUnresolvedSet & Output,UnresolvedSetImpl & VOutput,llvm::SmallPtrSet<NamedDecl *,8> & HiddenVBaseCs)1629 static void CollectVisibleConversions(
1630     ASTContext &Context, const CXXRecordDecl *Record, bool InVirtual,
1631     AccessSpecifier Access,
1632     const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1633     ASTUnresolvedSet &Output, UnresolvedSetImpl &VOutput,
1634     llvm::SmallPtrSet<NamedDecl *, 8> &HiddenVBaseCs) {
1635   // The set of types which have conversions in this class or its
1636   // subclasses.  As an optimization, we don't copy the derived set
1637   // unless it might change.
1638   const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1639   llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1640 
1641   // Collect the direct conversions and figure out which conversions
1642   // will be hidden in the subclasses.
1643   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1644   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1645   if (ConvI != ConvE) {
1646     HiddenTypesBuffer = ParentHiddenTypes;
1647     HiddenTypes = &HiddenTypesBuffer;
1648 
1649     for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
1650       CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1651       bool Hidden = ParentHiddenTypes.count(ConvType);
1652       if (!Hidden)
1653         HiddenTypesBuffer.insert(ConvType);
1654 
1655       // If this conversion is hidden and we're in a virtual base,
1656       // remember that it's hidden along some inheritance path.
1657       if (Hidden && InVirtual)
1658         HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1659 
1660       // If this conversion isn't hidden, add it to the appropriate output.
1661       else if (!Hidden) {
1662         AccessSpecifier IAccess
1663           = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1664 
1665         if (InVirtual)
1666           VOutput.addDecl(I.getDecl(), IAccess);
1667         else
1668           Output.addDecl(Context, I.getDecl(), IAccess);
1669       }
1670     }
1671   }
1672 
1673   // Collect information recursively from any base classes.
1674   for (const auto &I : Record->bases()) {
1675     const auto *RT = I.getType()->getAs<RecordType>();
1676     if (!RT) continue;
1677 
1678     AccessSpecifier BaseAccess
1679       = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1680     bool BaseInVirtual = InVirtual || I.isVirtual();
1681 
1682     auto *Base = cast<CXXRecordDecl>(RT->getDecl());
1683     CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1684                               *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1685   }
1686 }
1687 
1688 /// Collect the visible conversions of a class.
1689 ///
1690 /// This would be extremely straightforward if it weren't for virtual
1691 /// bases.  It might be worth special-casing that, really.
CollectVisibleConversions(ASTContext & Context,const CXXRecordDecl * Record,ASTUnresolvedSet & Output)1692 static void CollectVisibleConversions(ASTContext &Context,
1693                                       const CXXRecordDecl *Record,
1694                                       ASTUnresolvedSet &Output) {
1695   // The collection of all conversions in virtual bases that we've
1696   // found.  These will be added to the output as long as they don't
1697   // appear in the hidden-conversions set.
1698   UnresolvedSet<8> VBaseCs;
1699 
1700   // The set of conversions in virtual bases that we've determined to
1701   // be hidden.
1702   llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1703 
1704   // The set of types hidden by classes derived from this one.
1705   llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1706 
1707   // Go ahead and collect the direct conversions and add them to the
1708   // hidden-types set.
1709   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1710   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1711   Output.append(Context, ConvI, ConvE);
1712   for (; ConvI != ConvE; ++ConvI)
1713     HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
1714 
1715   // Recursively collect conversions from base classes.
1716   for (const auto &I : Record->bases()) {
1717     const auto *RT = I.getType()->getAs<RecordType>();
1718     if (!RT) continue;
1719 
1720     CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1721                               I.isVirtual(), I.getAccessSpecifier(),
1722                               HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1723   }
1724 
1725   // Add any unhidden conversions provided by virtual bases.
1726   for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1727          I != E; ++I) {
1728     if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1729       Output.addDecl(Context, I.getDecl(), I.getAccess());
1730   }
1731 }
1732 
1733 /// getVisibleConversionFunctions - get all conversion functions visible
1734 /// in current class; including conversion function templates.
1735 llvm::iterator_range<CXXRecordDecl::conversion_iterator>
getVisibleConversionFunctions() const1736 CXXRecordDecl::getVisibleConversionFunctions() const {
1737   ASTContext &Ctx = getASTContext();
1738 
1739   ASTUnresolvedSet *Set;
1740   if (bases_begin() == bases_end()) {
1741     // If root class, all conversions are visible.
1742     Set = &data().Conversions.get(Ctx);
1743   } else {
1744     Set = &data().VisibleConversions.get(Ctx);
1745     // If visible conversion list is not evaluated, evaluate it.
1746     if (!data().ComputedVisibleConversions) {
1747       CollectVisibleConversions(Ctx, this, *Set);
1748       data().ComputedVisibleConversions = true;
1749     }
1750   }
1751   return llvm::make_range(Set->begin(), Set->end());
1752 }
1753 
removeConversion(const NamedDecl * ConvDecl)1754 void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1755   // This operation is O(N) but extremely rare.  Sema only uses it to
1756   // remove UsingShadowDecls in a class that were followed by a direct
1757   // declaration, e.g.:
1758   //   class A : B {
1759   //     using B::operator int;
1760   //     operator int();
1761   //   };
1762   // This is uncommon by itself and even more uncommon in conjunction
1763   // with sufficiently large numbers of directly-declared conversions
1764   // that asymptotic behavior matters.
1765 
1766   ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
1767   for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1768     if (Convs[I].getDecl() == ConvDecl) {
1769       Convs.erase(I);
1770       assert(llvm::find(Convs, ConvDecl) == Convs.end() &&
1771              "conversion was found multiple times in unresolved set");
1772       return;
1773     }
1774   }
1775 
1776   llvm_unreachable("conversion not found in set!");
1777 }
1778 
getInstantiatedFromMemberClass() const1779 CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1780   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1781     return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1782 
1783   return nullptr;
1784 }
1785 
getMemberSpecializationInfo() const1786 MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1787   return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1788 }
1789 
1790 void
setInstantiationOfMemberClass(CXXRecordDecl * RD,TemplateSpecializationKind TSK)1791 CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1792                                              TemplateSpecializationKind TSK) {
1793   assert(TemplateOrInstantiation.isNull() &&
1794          "Previous template or instantiation?");
1795   assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
1796   TemplateOrInstantiation
1797     = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1798 }
1799 
getDescribedClassTemplate() const1800 ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1801   return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1802 }
1803 
setDescribedClassTemplate(ClassTemplateDecl * Template)1804 void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1805   TemplateOrInstantiation = Template;
1806 }
1807 
getTemplateSpecializationKind() const1808 TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1809   if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this))
1810     return Spec->getSpecializationKind();
1811 
1812   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1813     return MSInfo->getTemplateSpecializationKind();
1814 
1815   return TSK_Undeclared;
1816 }
1817 
1818 void
setTemplateSpecializationKind(TemplateSpecializationKind TSK)1819 CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1820   if (auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1821     Spec->setSpecializationKind(TSK);
1822     return;
1823   }
1824 
1825   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1826     MSInfo->setTemplateSpecializationKind(TSK);
1827     return;
1828   }
1829 
1830   llvm_unreachable("Not a class template or member class specialization");
1831 }
1832 
getTemplateInstantiationPattern() const1833 const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
1834   auto GetDefinitionOrSelf =
1835       [](const CXXRecordDecl *D) -> const CXXRecordDecl * {
1836     if (auto *Def = D->getDefinition())
1837       return Def;
1838     return D;
1839   };
1840 
1841   // If it's a class template specialization, find the template or partial
1842   // specialization from which it was instantiated.
1843   if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1844     auto From = TD->getInstantiatedFrom();
1845     if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1846       while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1847         if (NewCTD->isMemberSpecialization())
1848           break;
1849         CTD = NewCTD;
1850       }
1851       return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1852     }
1853     if (auto *CTPSD =
1854             From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1855       while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1856         if (NewCTPSD->isMemberSpecialization())
1857           break;
1858         CTPSD = NewCTPSD;
1859       }
1860       return GetDefinitionOrSelf(CTPSD);
1861     }
1862   }
1863 
1864   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1865     if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
1866       const CXXRecordDecl *RD = this;
1867       while (auto *NewRD = RD->getInstantiatedFromMemberClass())
1868         RD = NewRD;
1869       return GetDefinitionOrSelf(RD);
1870     }
1871   }
1872 
1873   assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
1874          "couldn't find pattern for class template instantiation");
1875   return nullptr;
1876 }
1877 
getDestructor() const1878 CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1879   ASTContext &Context = getASTContext();
1880   QualType ClassType = Context.getTypeDeclType(this);
1881 
1882   DeclarationName Name
1883     = Context.DeclarationNames.getCXXDestructorName(
1884                                           Context.getCanonicalType(ClassType));
1885 
1886   DeclContext::lookup_result R = lookup(Name);
1887 
1888   return R.empty() ? nullptr : dyn_cast<CXXDestructorDecl>(R.front());
1889 }
1890 
isAnyDestructorNoReturn() const1891 bool CXXRecordDecl::isAnyDestructorNoReturn() const {
1892   // Destructor is noreturn.
1893   if (const CXXDestructorDecl *Destructor = getDestructor())
1894     if (Destructor->isNoReturn())
1895       return true;
1896 
1897   // Check base classes destructor for noreturn.
1898   for (const auto &Base : bases())
1899     if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl())
1900       if (RD->isAnyDestructorNoReturn())
1901         return true;
1902 
1903   // Check fields for noreturn.
1904   for (const auto *Field : fields())
1905     if (const CXXRecordDecl *RD =
1906             Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1907       if (RD->isAnyDestructorNoReturn())
1908         return true;
1909 
1910   // All destructors are not noreturn.
1911   return false;
1912 }
1913 
isDeclContextInNamespace(const DeclContext * DC)1914 static bool isDeclContextInNamespace(const DeclContext *DC) {
1915   while (!DC->isTranslationUnit()) {
1916     if (DC->isNamespace())
1917       return true;
1918     DC = DC->getParent();
1919   }
1920   return false;
1921 }
1922 
isInterfaceLike() const1923 bool CXXRecordDecl::isInterfaceLike() const {
1924   assert(hasDefinition() && "checking for interface-like without a definition");
1925   // All __interfaces are inheritently interface-like.
1926   if (isInterface())
1927     return true;
1928 
1929   // Interface-like types cannot have a user declared constructor, destructor,
1930   // friends, VBases, conversion functions, or fields.  Additionally, lambdas
1931   // cannot be interface types.
1932   if (isLambda() || hasUserDeclaredConstructor() ||
1933       hasUserDeclaredDestructor() || !field_empty() || hasFriends() ||
1934       getNumVBases() > 0 || conversion_end() - conversion_begin() > 0)
1935     return false;
1936 
1937   // No interface-like type can have a method with a definition.
1938   for (const auto *const Method : methods())
1939     if (Method->isDefined() && !Method->isImplicit())
1940       return false;
1941 
1942   // Check "Special" types.
1943   const auto *Uuid = getAttr<UuidAttr>();
1944   // MS SDK declares IUnknown/IDispatch both in the root of a TU, or in an
1945   // extern C++ block directly in the TU.  These are only valid if in one
1946   // of these two situations.
1947   if (Uuid && isStruct() && !getDeclContext()->isExternCContext() &&
1948       !isDeclContextInNamespace(getDeclContext()) &&
1949       ((getName() == "IUnknown" &&
1950         Uuid->getGuid() == "00000000-0000-0000-C000-000000000046") ||
1951        (getName() == "IDispatch" &&
1952         Uuid->getGuid() == "00020400-0000-0000-C000-000000000046"))) {
1953     if (getNumBases() > 0)
1954       return false;
1955     return true;
1956   }
1957 
1958   // FIXME: Any access specifiers is supposed to make this no longer interface
1959   // like.
1960 
1961   // If this isn't a 'special' type, it must have a single interface-like base.
1962   if (getNumBases() != 1)
1963     return false;
1964 
1965   const auto BaseSpec = *bases_begin();
1966   if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() != AS_public)
1967     return false;
1968   const auto *Base = BaseSpec.getType()->getAsCXXRecordDecl();
1969   if (Base->isInterface() || !Base->isInterfaceLike())
1970     return false;
1971   return true;
1972 }
1973 
completeDefinition()1974 void CXXRecordDecl::completeDefinition() {
1975   completeDefinition(nullptr);
1976 }
1977 
completeDefinition(CXXFinalOverriderMap * FinalOverriders)1978 void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1979   RecordDecl::completeDefinition();
1980 
1981   // If the class may be abstract (but hasn't been marked as such), check for
1982   // any pure final overriders.
1983   if (mayBeAbstract()) {
1984     CXXFinalOverriderMap MyFinalOverriders;
1985     if (!FinalOverriders) {
1986       getFinalOverriders(MyFinalOverriders);
1987       FinalOverriders = &MyFinalOverriders;
1988     }
1989 
1990     bool Done = false;
1991     for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1992                                      MEnd = FinalOverriders->end();
1993          M != MEnd && !Done; ++M) {
1994       for (OverridingMethods::iterator SO = M->second.begin(),
1995                                     SOEnd = M->second.end();
1996            SO != SOEnd && !Done; ++SO) {
1997         assert(SO->second.size() > 0 &&
1998                "All virtual functions have overriding virtual functions");
1999 
2000         // C++ [class.abstract]p4:
2001         //   A class is abstract if it contains or inherits at least one
2002         //   pure virtual function for which the final overrider is pure
2003         //   virtual.
2004         if (SO->second.front().Method->isPure()) {
2005           data().Abstract = true;
2006           Done = true;
2007           break;
2008         }
2009       }
2010     }
2011   }
2012 
2013   // Set access bits correctly on the directly-declared conversions.
2014   for (conversion_iterator I = conversion_begin(), E = conversion_end();
2015        I != E; ++I)
2016     I.setAccess((*I)->getAccess());
2017 }
2018 
mayBeAbstract() const2019 bool CXXRecordDecl::mayBeAbstract() const {
2020   if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
2021       isDependentContext())
2022     return false;
2023 
2024   for (const auto &B : bases()) {
2025     const auto *BaseDecl =
2026         cast<CXXRecordDecl>(B.getType()->castAs<RecordType>()->getDecl());
2027     if (BaseDecl->isAbstract())
2028       return true;
2029   }
2030 
2031   return false;
2032 }
2033 
isEffectivelyFinal() const2034 bool CXXRecordDecl::isEffectivelyFinal() const {
2035   auto *Def = getDefinition();
2036   if (!Def)
2037     return false;
2038   if (Def->hasAttr<FinalAttr>())
2039     return true;
2040   if (const auto *Dtor = Def->getDestructor())
2041     if (Dtor->hasAttr<FinalAttr>())
2042       return true;
2043   return false;
2044 }
2045 
anchor()2046 void CXXDeductionGuideDecl::anchor() {}
2047 
isEquivalent(const ExplicitSpecifier Other) const2048 bool ExplicitSpecifier::isEquivalent(const ExplicitSpecifier Other) const {
2049   if ((getKind() != Other.getKind() ||
2050        getKind() == ExplicitSpecKind::Unresolved)) {
2051     if (getKind() == ExplicitSpecKind::Unresolved &&
2052         Other.getKind() == ExplicitSpecKind::Unresolved) {
2053       ODRHash SelfHash, OtherHash;
2054       SelfHash.AddStmt(getExpr());
2055       OtherHash.AddStmt(Other.getExpr());
2056       return SelfHash.CalculateHash() == OtherHash.CalculateHash();
2057     } else
2058       return false;
2059   }
2060   return true;
2061 }
2062 
getFromDecl(FunctionDecl * Function)2063 ExplicitSpecifier ExplicitSpecifier::getFromDecl(FunctionDecl *Function) {
2064   switch (Function->getDeclKind()) {
2065   case Decl::Kind::CXXConstructor:
2066     return cast<CXXConstructorDecl>(Function)->getExplicitSpecifier();
2067   case Decl::Kind::CXXConversion:
2068     return cast<CXXConversionDecl>(Function)->getExplicitSpecifier();
2069   case Decl::Kind::CXXDeductionGuide:
2070     return cast<CXXDeductionGuideDecl>(Function)->getExplicitSpecifier();
2071   default:
2072     return {};
2073   }
2074 }
2075 
2076 CXXDeductionGuideDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation StartLoc,ExplicitSpecifier ES,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,SourceLocation EndLocation,CXXConstructorDecl * Ctor)2077 CXXDeductionGuideDecl::Create(ASTContext &C, DeclContext *DC,
2078                               SourceLocation StartLoc, ExplicitSpecifier ES,
2079                               const DeclarationNameInfo &NameInfo, QualType T,
2080                               TypeSourceInfo *TInfo, SourceLocation EndLocation,
2081                               CXXConstructorDecl *Ctor) {
2082   return new (C, DC) CXXDeductionGuideDecl(C, DC, StartLoc, ES, NameInfo, T,
2083                                            TInfo, EndLocation, Ctor);
2084 }
2085 
CreateDeserialized(ASTContext & C,unsigned ID)2086 CXXDeductionGuideDecl *CXXDeductionGuideDecl::CreateDeserialized(ASTContext &C,
2087                                                                  unsigned ID) {
2088   return new (C, ID) CXXDeductionGuideDecl(
2089       C, nullptr, SourceLocation(), ExplicitSpecifier(), DeclarationNameInfo(),
2090       QualType(), nullptr, SourceLocation(), nullptr);
2091 }
2092 
Create(ASTContext & C,DeclContext * DC,SourceLocation StartLoc)2093 RequiresExprBodyDecl *RequiresExprBodyDecl::Create(
2094     ASTContext &C, DeclContext *DC, SourceLocation StartLoc) {
2095   return new (C, DC) RequiresExprBodyDecl(C, DC, StartLoc);
2096 }
2097 
CreateDeserialized(ASTContext & C,unsigned ID)2098 RequiresExprBodyDecl *RequiresExprBodyDecl::CreateDeserialized(ASTContext &C,
2099                                                                unsigned ID) {
2100   return new (C, ID) RequiresExprBodyDecl(C, nullptr, SourceLocation());
2101 }
2102 
anchor()2103 void CXXMethodDecl::anchor() {}
2104 
isStatic() const2105 bool CXXMethodDecl::isStatic() const {
2106   const CXXMethodDecl *MD = getCanonicalDecl();
2107 
2108   if (MD->getStorageClass() == SC_Static)
2109     return true;
2110 
2111   OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
2112   return isStaticOverloadedOperator(OOK);
2113 }
2114 
recursivelyOverrides(const CXXMethodDecl * DerivedMD,const CXXMethodDecl * BaseMD)2115 static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
2116                                  const CXXMethodDecl *BaseMD) {
2117   for (const CXXMethodDecl *MD : DerivedMD->overridden_methods()) {
2118     if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
2119       return true;
2120     if (recursivelyOverrides(MD, BaseMD))
2121       return true;
2122   }
2123   return false;
2124 }
2125 
2126 CXXMethodDecl *
getCorrespondingMethodDeclaredInClass(const CXXRecordDecl * RD,bool MayBeBase)2127 CXXMethodDecl::getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD,
2128                                                      bool MayBeBase) {
2129   if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
2130     return this;
2131 
2132   // Lookup doesn't work for destructors, so handle them separately.
2133   if (isa<CXXDestructorDecl>(this)) {
2134     CXXMethodDecl *MD = RD->getDestructor();
2135     if (MD) {
2136       if (recursivelyOverrides(MD, this))
2137         return MD;
2138       if (MayBeBase && recursivelyOverrides(this, MD))
2139         return MD;
2140     }
2141     return nullptr;
2142   }
2143 
2144   for (auto *ND : RD->lookup(getDeclName())) {
2145     auto *MD = dyn_cast<CXXMethodDecl>(ND);
2146     if (!MD)
2147       continue;
2148     if (recursivelyOverrides(MD, this))
2149       return MD;
2150     if (MayBeBase && recursivelyOverrides(this, MD))
2151       return MD;
2152   }
2153 
2154   return nullptr;
2155 }
2156 
2157 CXXMethodDecl *
getCorrespondingMethodInClass(const CXXRecordDecl * RD,bool MayBeBase)2158 CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
2159                                              bool MayBeBase) {
2160   if (auto *MD = getCorrespondingMethodDeclaredInClass(RD, MayBeBase))
2161     return MD;
2162 
2163   llvm::SmallVector<CXXMethodDecl*, 4> FinalOverriders;
2164   auto AddFinalOverrider = [&](CXXMethodDecl *D) {
2165     // If this function is overridden by a candidate final overrider, it is not
2166     // a final overrider.
2167     for (CXXMethodDecl *OtherD : FinalOverriders) {
2168       if (declaresSameEntity(D, OtherD) || recursivelyOverrides(OtherD, D))
2169         return;
2170     }
2171 
2172     // Other candidate final overriders might be overridden by this function.
2173     FinalOverriders.erase(
2174         std::remove_if(FinalOverriders.begin(), FinalOverriders.end(),
2175                        [&](CXXMethodDecl *OtherD) {
2176                          return recursivelyOverrides(D, OtherD);
2177                        }),
2178         FinalOverriders.end());
2179 
2180     FinalOverriders.push_back(D);
2181   };
2182 
2183   for (const auto &I : RD->bases()) {
2184     const RecordType *RT = I.getType()->getAs<RecordType>();
2185     if (!RT)
2186       continue;
2187     const auto *Base = cast<CXXRecordDecl>(RT->getDecl());
2188     if (CXXMethodDecl *D = this->getCorrespondingMethodInClass(Base))
2189       AddFinalOverrider(D);
2190   }
2191 
2192   return FinalOverriders.size() == 1 ? FinalOverriders.front() : nullptr;
2193 }
2194 
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,StorageClass SC,bool isInline,ConstexprSpecKind ConstexprKind,SourceLocation EndLocation,Expr * TrailingRequiresClause)2195 CXXMethodDecl *CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
2196                                      SourceLocation StartLoc,
2197                                      const DeclarationNameInfo &NameInfo,
2198                                      QualType T, TypeSourceInfo *TInfo,
2199                                      StorageClass SC, bool isInline,
2200                                      ConstexprSpecKind ConstexprKind,
2201                                      SourceLocation EndLocation,
2202                                      Expr *TrailingRequiresClause) {
2203   return new (C, RD)
2204       CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo, T, TInfo, SC,
2205                     isInline, ConstexprKind, EndLocation,
2206                     TrailingRequiresClause);
2207 }
2208 
CreateDeserialized(ASTContext & C,unsigned ID)2209 CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2210   return new (C, ID)
2211       CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
2212                     DeclarationNameInfo(), QualType(), nullptr, SC_None, false,
2213                     ConstexprSpecKind::Unspecified, SourceLocation(), nullptr);
2214 }
2215 
getDevirtualizedMethod(const Expr * Base,bool IsAppleKext)2216 CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
2217                                                      bool IsAppleKext) {
2218   assert(isVirtual() && "this method is expected to be virtual");
2219 
2220   // When building with -fapple-kext, all calls must go through the vtable since
2221   // the kernel linker can do runtime patching of vtables.
2222   if (IsAppleKext)
2223     return nullptr;
2224 
2225   // If the member function is marked 'final', we know that it can't be
2226   // overridden and can therefore devirtualize it unless it's pure virtual.
2227   if (hasAttr<FinalAttr>())
2228     return isPure() ? nullptr : this;
2229 
2230   // If Base is unknown, we cannot devirtualize.
2231   if (!Base)
2232     return nullptr;
2233 
2234   // If the base expression (after skipping derived-to-base conversions) is a
2235   // class prvalue, then we can devirtualize.
2236   Base = Base->getBestDynamicClassTypeExpr();
2237   if (Base->isRValue() && Base->getType()->isRecordType())
2238     return this;
2239 
2240   // If we don't even know what we would call, we can't devirtualize.
2241   const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
2242   if (!BestDynamicDecl)
2243     return nullptr;
2244 
2245   // There may be a method corresponding to MD in a derived class.
2246   CXXMethodDecl *DevirtualizedMethod =
2247       getCorrespondingMethodInClass(BestDynamicDecl);
2248 
2249   // If there final overrider in the dynamic type is ambiguous, we can't
2250   // devirtualize this call.
2251   if (!DevirtualizedMethod)
2252     return nullptr;
2253 
2254   // If that method is pure virtual, we can't devirtualize. If this code is
2255   // reached, the result would be UB, not a direct call to the derived class
2256   // function, and we can't assume the derived class function is defined.
2257   if (DevirtualizedMethod->isPure())
2258     return nullptr;
2259 
2260   // If that method is marked final, we can devirtualize it.
2261   if (DevirtualizedMethod->hasAttr<FinalAttr>())
2262     return DevirtualizedMethod;
2263 
2264   // Similarly, if the class itself or its destructor is marked 'final',
2265   // the class can't be derived from and we can therefore devirtualize the
2266   // member function call.
2267   if (BestDynamicDecl->isEffectivelyFinal())
2268     return DevirtualizedMethod;
2269 
2270   if (const auto *DRE = dyn_cast<DeclRefExpr>(Base)) {
2271     if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2272       if (VD->getType()->isRecordType())
2273         // This is a record decl. We know the type and can devirtualize it.
2274         return DevirtualizedMethod;
2275 
2276     return nullptr;
2277   }
2278 
2279   // We can devirtualize calls on an object accessed by a class member access
2280   // expression, since by C++11 [basic.life]p6 we know that it can't refer to
2281   // a derived class object constructed in the same location.
2282   if (const auto *ME = dyn_cast<MemberExpr>(Base)) {
2283     const ValueDecl *VD = ME->getMemberDecl();
2284     return VD->getType()->isRecordType() ? DevirtualizedMethod : nullptr;
2285   }
2286 
2287   // Likewise for calls on an object accessed by a (non-reference) pointer to
2288   // member access.
2289   if (auto *BO = dyn_cast<BinaryOperator>(Base)) {
2290     if (BO->isPtrMemOp()) {
2291       auto *MPT = BO->getRHS()->getType()->castAs<MemberPointerType>();
2292       if (MPT->getPointeeType()->isRecordType())
2293         return DevirtualizedMethod;
2294     }
2295   }
2296 
2297   // We can't devirtualize the call.
2298   return nullptr;
2299 }
2300 
isUsualDeallocationFunction(SmallVectorImpl<const FunctionDecl * > & PreventedBy) const2301 bool CXXMethodDecl::isUsualDeallocationFunction(
2302     SmallVectorImpl<const FunctionDecl *> &PreventedBy) const {
2303   assert(PreventedBy.empty() && "PreventedBy is expected to be empty");
2304   if (getOverloadedOperator() != OO_Delete &&
2305       getOverloadedOperator() != OO_Array_Delete)
2306     return false;
2307 
2308   // C++ [basic.stc.dynamic.deallocation]p2:
2309   //   A template instance is never a usual deallocation function,
2310   //   regardless of its signature.
2311   if (getPrimaryTemplate())
2312     return false;
2313 
2314   // C++ [basic.stc.dynamic.deallocation]p2:
2315   //   If a class T has a member deallocation function named operator delete
2316   //   with exactly one parameter, then that function is a usual (non-placement)
2317   //   deallocation function. [...]
2318   if (getNumParams() == 1)
2319     return true;
2320   unsigned UsualParams = 1;
2321 
2322   // C++ P0722:
2323   //   A destroying operator delete is a usual deallocation function if
2324   //   removing the std::destroying_delete_t parameter and changing the
2325   //   first parameter type from T* to void* results in the signature of
2326   //   a usual deallocation function.
2327   if (isDestroyingOperatorDelete())
2328     ++UsualParams;
2329 
2330   // C++ <=14 [basic.stc.dynamic.deallocation]p2:
2331   //   [...] If class T does not declare such an operator delete but does
2332   //   declare a member deallocation function named operator delete with
2333   //   exactly two parameters, the second of which has type std::size_t (18.1),
2334   //   then this function is a usual deallocation function.
2335   //
2336   // C++17 says a usual deallocation function is one with the signature
2337   //   (void* [, size_t] [, std::align_val_t] [, ...])
2338   // and all such functions are usual deallocation functions. It's not clear
2339   // that allowing varargs functions was intentional.
2340   ASTContext &Context = getASTContext();
2341   if (UsualParams < getNumParams() &&
2342       Context.hasSameUnqualifiedType(getParamDecl(UsualParams)->getType(),
2343                                      Context.getSizeType()))
2344     ++UsualParams;
2345 
2346   if (UsualParams < getNumParams() &&
2347       getParamDecl(UsualParams)->getType()->isAlignValT())
2348     ++UsualParams;
2349 
2350   if (UsualParams != getNumParams())
2351     return false;
2352 
2353   // In C++17 onwards, all potential usual deallocation functions are actual
2354   // usual deallocation functions. Honor this behavior when post-C++14
2355   // deallocation functions are offered as extensions too.
2356   // FIXME(EricWF): Destrying Delete should be a language option. How do we
2357   // handle when destroying delete is used prior to C++17?
2358   if (Context.getLangOpts().CPlusPlus17 ||
2359       Context.getLangOpts().AlignedAllocation ||
2360       isDestroyingOperatorDelete())
2361     return true;
2362 
2363   // This function is a usual deallocation function if there are no
2364   // single-parameter deallocation functions of the same kind.
2365   DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
2366   bool Result = true;
2367   for (const auto *D : R) {
2368     if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2369       if (FD->getNumParams() == 1) {
2370         PreventedBy.push_back(FD);
2371         Result = false;
2372       }
2373     }
2374   }
2375   return Result;
2376 }
2377 
isCopyAssignmentOperator() const2378 bool CXXMethodDecl::isCopyAssignmentOperator() const {
2379   // C++0x [class.copy]p17:
2380   //  A user-declared copy assignment operator X::operator= is a non-static
2381   //  non-template member function of class X with exactly one parameter of
2382   //  type X, X&, const X&, volatile X& or const volatile X&.
2383   if (/*operator=*/getOverloadedOperator() != OO_Equal ||
2384       /*non-static*/ isStatic() ||
2385       /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2386       getNumParams() != 1)
2387     return false;
2388 
2389   QualType ParamType = getParamDecl(0)->getType();
2390   if (const auto *Ref = ParamType->getAs<LValueReferenceType>())
2391     ParamType = Ref->getPointeeType();
2392 
2393   ASTContext &Context = getASTContext();
2394   QualType ClassType
2395     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2396   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2397 }
2398 
isMoveAssignmentOperator() const2399 bool CXXMethodDecl::isMoveAssignmentOperator() const {
2400   // C++0x [class.copy]p19:
2401   //  A user-declared move assignment operator X::operator= is a non-static
2402   //  non-template member function of class X with exactly one parameter of type
2403   //  X&&, const X&&, volatile X&&, or const volatile X&&.
2404   if (getOverloadedOperator() != OO_Equal || isStatic() ||
2405       getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2406       getNumParams() != 1)
2407     return false;
2408 
2409   QualType ParamType = getParamDecl(0)->getType();
2410   if (!isa<RValueReferenceType>(ParamType))
2411     return false;
2412   ParamType = ParamType->getPointeeType();
2413 
2414   ASTContext &Context = getASTContext();
2415   QualType ClassType
2416     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2417   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2418 }
2419 
addOverriddenMethod(const CXXMethodDecl * MD)2420 void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
2421   assert(MD->isCanonicalDecl() && "Method is not canonical!");
2422   assert(!MD->getParent()->isDependentContext() &&
2423          "Can't add an overridden method to a class template!");
2424   assert(MD->isVirtual() && "Method is not virtual!");
2425 
2426   getASTContext().addOverriddenMethod(this, MD);
2427 }
2428 
begin_overridden_methods() const2429 CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
2430   if (isa<CXXConstructorDecl>(this)) return nullptr;
2431   return getASTContext().overridden_methods_begin(this);
2432 }
2433 
end_overridden_methods() const2434 CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
2435   if (isa<CXXConstructorDecl>(this)) return nullptr;
2436   return getASTContext().overridden_methods_end(this);
2437 }
2438 
size_overridden_methods() const2439 unsigned CXXMethodDecl::size_overridden_methods() const {
2440   if (isa<CXXConstructorDecl>(this)) return 0;
2441   return getASTContext().overridden_methods_size(this);
2442 }
2443 
2444 CXXMethodDecl::overridden_method_range
overridden_methods() const2445 CXXMethodDecl::overridden_methods() const {
2446   if (isa<CXXConstructorDecl>(this))
2447     return overridden_method_range(nullptr, nullptr);
2448   return getASTContext().overridden_methods(this);
2449 }
2450 
getThisObjectType(ASTContext & C,const FunctionProtoType * FPT,const CXXRecordDecl * Decl)2451 static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT,
2452                                   const CXXRecordDecl *Decl) {
2453   QualType ClassTy = C.getTypeDeclType(Decl);
2454   return C.getQualifiedType(ClassTy, FPT->getMethodQuals());
2455 }
2456 
getThisType(const FunctionProtoType * FPT,const CXXRecordDecl * Decl)2457 QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT,
2458                                     const CXXRecordDecl *Decl) {
2459   ASTContext &C = Decl->getASTContext();
2460   QualType ObjectTy = ::getThisObjectType(C, FPT, Decl);
2461   return C.getPointerType(ObjectTy);
2462 }
2463 
getThisObjectType(const FunctionProtoType * FPT,const CXXRecordDecl * Decl)2464 QualType CXXMethodDecl::getThisObjectType(const FunctionProtoType *FPT,
2465                                           const CXXRecordDecl *Decl) {
2466   ASTContext &C = Decl->getASTContext();
2467   return ::getThisObjectType(C, FPT, Decl);
2468 }
2469 
getThisType() const2470 QualType CXXMethodDecl::getThisType() const {
2471   // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
2472   // If the member function is declared const, the type of this is const X*,
2473   // if the member function is declared volatile, the type of this is
2474   // volatile X*, and if the member function is declared const volatile,
2475   // the type of this is const volatile X*.
2476   assert(isInstance() && "No 'this' for static methods!");
2477   return CXXMethodDecl::getThisType(getType()->castAs<FunctionProtoType>(),
2478                                     getParent());
2479 }
2480 
getThisObjectType() const2481 QualType CXXMethodDecl::getThisObjectType() const {
2482   // Ditto getThisType.
2483   assert(isInstance() && "No 'this' for static methods!");
2484   return CXXMethodDecl::getThisObjectType(
2485       getType()->castAs<FunctionProtoType>(), getParent());
2486 }
2487 
hasInlineBody() const2488 bool CXXMethodDecl::hasInlineBody() const {
2489   // If this function is a template instantiation, look at the template from
2490   // which it was instantiated.
2491   const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
2492   if (!CheckFn)
2493     CheckFn = this;
2494 
2495   const FunctionDecl *fn;
2496   return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
2497          (fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
2498 }
2499 
isLambdaStaticInvoker() const2500 bool CXXMethodDecl::isLambdaStaticInvoker() const {
2501   const CXXRecordDecl *P = getParent();
2502   return P->isLambda() && getDeclName().isIdentifier() &&
2503          getName() == getLambdaStaticInvokerName();
2504 }
2505 
CXXCtorInitializer(ASTContext & Context,TypeSourceInfo * TInfo,bool IsVirtual,SourceLocation L,Expr * Init,SourceLocation R,SourceLocation EllipsisLoc)2506 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2507                                        TypeSourceInfo *TInfo, bool IsVirtual,
2508                                        SourceLocation L, Expr *Init,
2509                                        SourceLocation R,
2510                                        SourceLocation EllipsisLoc)
2511     : Initializee(TInfo), Init(Init), MemberOrEllipsisLocation(EllipsisLoc),
2512       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
2513       IsWritten(false), SourceOrder(0) {}
2514 
CXXCtorInitializer(ASTContext & Context,FieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R)2515 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
2516                                        SourceLocation MemberLoc,
2517                                        SourceLocation L, Expr *Init,
2518                                        SourceLocation R)
2519     : Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2520       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2521       IsWritten(false), SourceOrder(0) {}
2522 
CXXCtorInitializer(ASTContext & Context,IndirectFieldDecl * Member,SourceLocation MemberLoc,SourceLocation L,Expr * Init,SourceLocation R)2523 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2524                                        IndirectFieldDecl *Member,
2525                                        SourceLocation MemberLoc,
2526                                        SourceLocation L, Expr *Init,
2527                                        SourceLocation R)
2528     : Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2529       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2530       IsWritten(false), SourceOrder(0) {}
2531 
CXXCtorInitializer(ASTContext & Context,TypeSourceInfo * TInfo,SourceLocation L,Expr * Init,SourceLocation R)2532 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2533                                        TypeSourceInfo *TInfo,
2534                                        SourceLocation L, Expr *Init,
2535                                        SourceLocation R)
2536     : Initializee(TInfo), Init(Init), LParenLoc(L), RParenLoc(R),
2537       IsDelegating(true), IsVirtual(false), IsWritten(false), SourceOrder(0) {}
2538 
getID(const ASTContext & Context) const2539 int64_t CXXCtorInitializer::getID(const ASTContext &Context) const {
2540   return Context.getAllocator()
2541                 .identifyKnownAlignedObject<CXXCtorInitializer>(this);
2542 }
2543 
getBaseClassLoc() const2544 TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
2545   if (isBaseInitializer())
2546     return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
2547   else
2548     return {};
2549 }
2550 
getBaseClass() const2551 const Type *CXXCtorInitializer::getBaseClass() const {
2552   if (isBaseInitializer())
2553     return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
2554   else
2555     return nullptr;
2556 }
2557 
getSourceLocation() const2558 SourceLocation CXXCtorInitializer::getSourceLocation() const {
2559   if (isInClassMemberInitializer())
2560     return getAnyMember()->getLocation();
2561 
2562   if (isAnyMemberInitializer())
2563     return getMemberLocation();
2564 
2565   if (const auto *TSInfo = Initializee.get<TypeSourceInfo *>())
2566     return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
2567 
2568   return {};
2569 }
2570 
getSourceRange() const2571 SourceRange CXXCtorInitializer::getSourceRange() const {
2572   if (isInClassMemberInitializer()) {
2573     FieldDecl *D = getAnyMember();
2574     if (Expr *I = D->getInClassInitializer())
2575       return I->getSourceRange();
2576     return {};
2577   }
2578 
2579   return SourceRange(getSourceLocation(), getRParenLoc());
2580 }
2581 
CXXConstructorDecl(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,ExplicitSpecifier ES,bool isInline,bool isImplicitlyDeclared,ConstexprSpecKind ConstexprKind,InheritedConstructor Inherited,Expr * TrailingRequiresClause)2582 CXXConstructorDecl::CXXConstructorDecl(
2583     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2584     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2585     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2586     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2587     Expr *TrailingRequiresClause)
2588     : CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2589                     SC_None, isInline, ConstexprKind, SourceLocation(),
2590                     TrailingRequiresClause) {
2591   setNumCtorInitializers(0);
2592   setInheritingConstructor(static_cast<bool>(Inherited));
2593   setImplicit(isImplicitlyDeclared);
2594   CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.getExpr() ? 1 : 0;
2595   if (Inherited)
2596     *getTrailingObjects<InheritedConstructor>() = Inherited;
2597   setExplicitSpecifier(ES);
2598 }
2599 
anchor()2600 void CXXConstructorDecl::anchor() {}
2601 
CreateDeserialized(ASTContext & C,unsigned ID,uint64_t AllocKind)2602 CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
2603                                                            unsigned ID,
2604                                                            uint64_t AllocKind) {
2605   bool hasTrailingExplicit = static_cast<bool>(AllocKind & TAKHasTailExplicit);
2606   bool isInheritingConstructor =
2607       static_cast<bool>(AllocKind & TAKInheritsConstructor);
2608   unsigned Extra =
2609       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2610           isInheritingConstructor, hasTrailingExplicit);
2611   auto *Result = new (C, ID, Extra) CXXConstructorDecl(
2612       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2613       ExplicitSpecifier(), false, false, ConstexprSpecKind::Unspecified,
2614       InheritedConstructor(), nullptr);
2615   Result->setInheritingConstructor(isInheritingConstructor);
2616   Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2617       hasTrailingExplicit;
2618   Result->setExplicitSpecifier(ExplicitSpecifier());
2619   return Result;
2620 }
2621 
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,ExplicitSpecifier ES,bool isInline,bool isImplicitlyDeclared,ConstexprSpecKind ConstexprKind,InheritedConstructor Inherited,Expr * TrailingRequiresClause)2622 CXXConstructorDecl *CXXConstructorDecl::Create(
2623     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2624     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2625     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2626     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2627     Expr *TrailingRequiresClause) {
2628   assert(NameInfo.getName().getNameKind()
2629          == DeclarationName::CXXConstructorName &&
2630          "Name must refer to a constructor");
2631   unsigned Extra =
2632       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2633           Inherited ? 1 : 0, ES.getExpr() ? 1 : 0);
2634   return new (C, RD, Extra)
2635       CXXConstructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, ES, isInline,
2636                          isImplicitlyDeclared, ConstexprKind, Inherited,
2637                          TrailingRequiresClause);
2638 }
2639 
init_begin() const2640 CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
2641   return CtorInitializers.get(getASTContext().getExternalSource());
2642 }
2643 
getTargetConstructor() const2644 CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
2645   assert(isDelegatingConstructor() && "Not a delegating constructor!");
2646   Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
2647   if (const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2648     return Construct->getConstructor();
2649 
2650   return nullptr;
2651 }
2652 
isDefaultConstructor() const2653 bool CXXConstructorDecl::isDefaultConstructor() const {
2654   // C++ [class.default.ctor]p1:
2655   //   A default constructor for a class X is a constructor of class X for
2656   //   which each parameter that is not a function parameter pack has a default
2657   //   argument (including the case of a constructor with no parameters)
2658   return getMinRequiredArguments() == 0;
2659 }
2660 
2661 bool
isCopyConstructor(unsigned & TypeQuals) const2662 CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
2663   return isCopyOrMoveConstructor(TypeQuals) &&
2664          getParamDecl(0)->getType()->isLValueReferenceType();
2665 }
2666 
isMoveConstructor(unsigned & TypeQuals) const2667 bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
2668   return isCopyOrMoveConstructor(TypeQuals) &&
2669          getParamDecl(0)->getType()->isRValueReferenceType();
2670 }
2671 
2672 /// Determine whether this is a copy or move constructor.
isCopyOrMoveConstructor(unsigned & TypeQuals) const2673 bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
2674   // C++ [class.copy]p2:
2675   //   A non-template constructor for class X is a copy constructor
2676   //   if its first parameter is of type X&, const X&, volatile X& or
2677   //   const volatile X&, and either there are no other parameters
2678   //   or else all other parameters have default arguments (8.3.6).
2679   // C++0x [class.copy]p3:
2680   //   A non-template constructor for class X is a move constructor if its
2681   //   first parameter is of type X&&, const X&&, volatile X&&, or
2682   //   const volatile X&&, and either there are no other parameters or else
2683   //   all other parameters have default arguments.
2684   if (!hasOneParamOrDefaultArgs() || getPrimaryTemplate() != nullptr ||
2685       getDescribedFunctionTemplate() != nullptr)
2686     return false;
2687 
2688   const ParmVarDecl *Param = getParamDecl(0);
2689 
2690   // Do we have a reference type?
2691   const auto *ParamRefType = Param->getType()->getAs<ReferenceType>();
2692   if (!ParamRefType)
2693     return false;
2694 
2695   // Is it a reference to our class type?
2696   ASTContext &Context = getASTContext();
2697 
2698   CanQualType PointeeType
2699     = Context.getCanonicalType(ParamRefType->getPointeeType());
2700   CanQualType ClassTy
2701     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2702   if (PointeeType.getUnqualifiedType() != ClassTy)
2703     return false;
2704 
2705   // FIXME: other qualifiers?
2706 
2707   // We have a copy or move constructor.
2708   TypeQuals = PointeeType.getCVRQualifiers();
2709   return true;
2710 }
2711 
isConvertingConstructor(bool AllowExplicit) const2712 bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
2713   // C++ [class.conv.ctor]p1:
2714   //   A constructor declared without the function-specifier explicit
2715   //   that can be called with a single parameter specifies a
2716   //   conversion from the type of its first parameter to the type of
2717   //   its class. Such a constructor is called a converting
2718   //   constructor.
2719   if (isExplicit() && !AllowExplicit)
2720     return false;
2721 
2722   // FIXME: This has nothing to do with the definition of converting
2723   // constructor, but is convenient for how we use this function in overload
2724   // resolution.
2725   return getNumParams() == 0
2726              ? getType()->castAs<FunctionProtoType>()->isVariadic()
2727              : getMinRequiredArguments() <= 1;
2728 }
2729 
isSpecializationCopyingObject() const2730 bool CXXConstructorDecl::isSpecializationCopyingObject() const {
2731   if (!hasOneParamOrDefaultArgs() || getDescribedFunctionTemplate() != nullptr)
2732     return false;
2733 
2734   const ParmVarDecl *Param = getParamDecl(0);
2735 
2736   ASTContext &Context = getASTContext();
2737   CanQualType ParamType = Context.getCanonicalType(Param->getType());
2738 
2739   // Is it the same as our class type?
2740   CanQualType ClassTy
2741     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2742   if (ParamType.getUnqualifiedType() != ClassTy)
2743     return false;
2744 
2745   return true;
2746 }
2747 
anchor()2748 void CXXDestructorDecl::anchor() {}
2749 
2750 CXXDestructorDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2751 CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2752   return new (C, ID) CXXDestructorDecl(
2753       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2754       false, false, ConstexprSpecKind::Unspecified, nullptr);
2755 }
2756 
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,bool isImplicitlyDeclared,ConstexprSpecKind ConstexprKind,Expr * TrailingRequiresClause)2757 CXXDestructorDecl *CXXDestructorDecl::Create(
2758     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2759     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2760     bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2761     Expr *TrailingRequiresClause) {
2762   assert(NameInfo.getName().getNameKind()
2763          == DeclarationName::CXXDestructorName &&
2764          "Name must refer to a destructor");
2765   return new (C, RD)
2766       CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline,
2767                         isImplicitlyDeclared, ConstexprKind,
2768                         TrailingRequiresClause);
2769 }
2770 
setOperatorDelete(FunctionDecl * OD,Expr * ThisArg)2771 void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
2772   auto *First = cast<CXXDestructorDecl>(getFirstDecl());
2773   if (OD && !First->OperatorDelete) {
2774     First->OperatorDelete = OD;
2775     First->OperatorDeleteThisArg = ThisArg;
2776     if (auto *L = getASTMutationListener())
2777       L->ResolvedOperatorDelete(First, OD, ThisArg);
2778   }
2779 }
2780 
anchor()2781 void CXXConversionDecl::anchor() {}
2782 
2783 CXXConversionDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2784 CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2785   return new (C, ID) CXXConversionDecl(
2786       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2787       false, ExplicitSpecifier(), ConstexprSpecKind::Unspecified,
2788       SourceLocation(), nullptr);
2789 }
2790 
Create(ASTContext & C,CXXRecordDecl * RD,SourceLocation StartLoc,const DeclarationNameInfo & NameInfo,QualType T,TypeSourceInfo * TInfo,bool isInline,ExplicitSpecifier ES,ConstexprSpecKind ConstexprKind,SourceLocation EndLocation,Expr * TrailingRequiresClause)2791 CXXConversionDecl *CXXConversionDecl::Create(
2792     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2793     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2794     bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind,
2795     SourceLocation EndLocation, Expr *TrailingRequiresClause) {
2796   assert(NameInfo.getName().getNameKind()
2797          == DeclarationName::CXXConversionFunctionName &&
2798          "Name must refer to a conversion function");
2799   return new (C, RD)
2800       CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline, ES,
2801                         ConstexprKind, EndLocation, TrailingRequiresClause);
2802 }
2803 
isLambdaToBlockPointerConversion() const2804 bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2805   return isImplicit() && getParent()->isLambda() &&
2806          getConversionType()->isBlockPointerType();
2807 }
2808 
LinkageSpecDecl(DeclContext * DC,SourceLocation ExternLoc,SourceLocation LangLoc,LanguageIDs lang,bool HasBraces)2809 LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
2810                                  SourceLocation LangLoc, LanguageIDs lang,
2811                                  bool HasBraces)
2812     : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
2813       ExternLoc(ExternLoc), RBraceLoc(SourceLocation()) {
2814   setLanguage(lang);
2815   LinkageSpecDeclBits.HasBraces = HasBraces;
2816 }
2817 
anchor()2818 void LinkageSpecDecl::anchor() {}
2819 
Create(ASTContext & C,DeclContext * DC,SourceLocation ExternLoc,SourceLocation LangLoc,LanguageIDs Lang,bool HasBraces)2820 LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
2821                                          DeclContext *DC,
2822                                          SourceLocation ExternLoc,
2823                                          SourceLocation LangLoc,
2824                                          LanguageIDs Lang,
2825                                          bool HasBraces) {
2826   return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2827 }
2828 
CreateDeserialized(ASTContext & C,unsigned ID)2829 LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2830                                                      unsigned ID) {
2831   return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
2832                                      SourceLocation(), lang_c, false);
2833 }
2834 
anchor()2835 void UsingDirectiveDecl::anchor() {}
2836 
Create(ASTContext & C,DeclContext * DC,SourceLocation L,SourceLocation NamespaceLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Used,DeclContext * CommonAncestor)2837 UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2838                                                SourceLocation L,
2839                                                SourceLocation NamespaceLoc,
2840                                            NestedNameSpecifierLoc QualifierLoc,
2841                                                SourceLocation IdentLoc,
2842                                                NamedDecl *Used,
2843                                                DeclContext *CommonAncestor) {
2844   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2845     Used = NS->getOriginalNamespace();
2846   return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2847                                         IdentLoc, Used, CommonAncestor);
2848 }
2849 
CreateDeserialized(ASTContext & C,unsigned ID)2850 UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2851                                                            unsigned ID) {
2852   return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2853                                         SourceLocation(),
2854                                         NestedNameSpecifierLoc(),
2855                                         SourceLocation(), nullptr, nullptr);
2856 }
2857 
getNominatedNamespace()2858 NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2859   if (auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2860     return NA->getNamespace();
2861   return cast_or_null<NamespaceDecl>(NominatedNamespace);
2862 }
2863 
NamespaceDecl(ASTContext & C,DeclContext * DC,bool Inline,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,NamespaceDecl * PrevDecl)2864 NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
2865                              SourceLocation StartLoc, SourceLocation IdLoc,
2866                              IdentifierInfo *Id, NamespaceDecl *PrevDecl)
2867     : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
2868       redeclarable_base(C), LocStart(StartLoc),
2869       AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2870   setPreviousDecl(PrevDecl);
2871 
2872   if (PrevDecl)
2873     AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2874 }
2875 
Create(ASTContext & C,DeclContext * DC,bool Inline,SourceLocation StartLoc,SourceLocation IdLoc,IdentifierInfo * Id,NamespaceDecl * PrevDecl)2876 NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2877                                      bool Inline, SourceLocation StartLoc,
2878                                      SourceLocation IdLoc, IdentifierInfo *Id,
2879                                      NamespaceDecl *PrevDecl) {
2880   return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
2881                                    PrevDecl);
2882 }
2883 
CreateDeserialized(ASTContext & C,unsigned ID)2884 NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2885   return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
2886                                    SourceLocation(), nullptr, nullptr);
2887 }
2888 
getOriginalNamespace()2889 NamespaceDecl *NamespaceDecl::getOriginalNamespace() {
2890   if (isFirstDecl())
2891     return this;
2892 
2893   return AnonOrFirstNamespaceAndInline.getPointer();
2894 }
2895 
getOriginalNamespace() const2896 const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
2897   if (isFirstDecl())
2898     return this;
2899 
2900   return AnonOrFirstNamespaceAndInline.getPointer();
2901 }
2902 
isOriginalNamespace() const2903 bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
2904 
getNextRedeclarationImpl()2905 NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
2906   return getNextRedeclaration();
2907 }
2908 
getPreviousDeclImpl()2909 NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2910   return getPreviousDecl();
2911 }
2912 
getMostRecentDeclImpl()2913 NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2914   return getMostRecentDecl();
2915 }
2916 
anchor()2917 void NamespaceAliasDecl::anchor() {}
2918 
getNextRedeclarationImpl()2919 NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2920   return getNextRedeclaration();
2921 }
2922 
getPreviousDeclImpl()2923 NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2924   return getPreviousDecl();
2925 }
2926 
getMostRecentDeclImpl()2927 NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2928   return getMostRecentDecl();
2929 }
2930 
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,SourceLocation AliasLoc,IdentifierInfo * Alias,NestedNameSpecifierLoc QualifierLoc,SourceLocation IdentLoc,NamedDecl * Namespace)2931 NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
2932                                                SourceLocation UsingLoc,
2933                                                SourceLocation AliasLoc,
2934                                                IdentifierInfo *Alias,
2935                                            NestedNameSpecifierLoc QualifierLoc,
2936                                                SourceLocation IdentLoc,
2937                                                NamedDecl *Namespace) {
2938   // FIXME: Preserve the aliased namespace as written.
2939   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2940     Namespace = NS->getOriginalNamespace();
2941   return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
2942                                         QualifierLoc, IdentLoc, Namespace);
2943 }
2944 
2945 NamespaceAliasDecl *
CreateDeserialized(ASTContext & C,unsigned ID)2946 NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2947   return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
2948                                         SourceLocation(), nullptr,
2949                                         NestedNameSpecifierLoc(),
2950                                         SourceLocation(), nullptr);
2951 }
2952 
anchor()2953 void LifetimeExtendedTemporaryDecl::anchor() {}
2954 
2955 /// Retrieve the storage duration for the materialized temporary.
getStorageDuration() const2956 StorageDuration LifetimeExtendedTemporaryDecl::getStorageDuration() const {
2957   const ValueDecl *ExtendingDecl = getExtendingDecl();
2958   if (!ExtendingDecl)
2959     return SD_FullExpression;
2960   // FIXME: This is not necessarily correct for a temporary materialized
2961   // within a default initializer.
2962   if (isa<FieldDecl>(ExtendingDecl))
2963     return SD_Automatic;
2964   // FIXME: This only works because storage class specifiers are not allowed
2965   // on decomposition declarations.
2966   if (isa<BindingDecl>(ExtendingDecl))
2967     return ExtendingDecl->getDeclContext()->isFunctionOrMethod() ? SD_Automatic
2968                                                                  : SD_Static;
2969   return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
2970 }
2971 
getOrCreateValue(bool MayCreate) const2972 APValue *LifetimeExtendedTemporaryDecl::getOrCreateValue(bool MayCreate) const {
2973   assert(getStorageDuration() == SD_Static &&
2974          "don't need to cache the computed value for this temporary");
2975   if (MayCreate && !Value) {
2976     Value = (new (getASTContext()) APValue);
2977     getASTContext().addDestruction(Value);
2978   }
2979   assert(Value && "may not be null");
2980   return Value;
2981 }
2982 
anchor()2983 void UsingShadowDecl::anchor() {}
2984 
UsingShadowDecl(Kind K,ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target)2985 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
2986                                  SourceLocation Loc, UsingDecl *Using,
2987                                  NamedDecl *Target)
2988     : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
2989       redeclarable_base(C), UsingOrNextShadow(cast<NamedDecl>(Using)) {
2990   if (Target)
2991     setTargetDecl(Target);
2992   setImplicit();
2993 }
2994 
UsingShadowDecl(Kind K,ASTContext & C,EmptyShell Empty)2995 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
2996     : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
2997       redeclarable_base(C) {}
2998 
2999 UsingShadowDecl *
CreateDeserialized(ASTContext & C,unsigned ID)3000 UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3001   return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
3002 }
3003 
getUsingDecl() const3004 UsingDecl *UsingShadowDecl::getUsingDecl() const {
3005   const UsingShadowDecl *Shadow = this;
3006   while (const auto *NextShadow =
3007              dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3008     Shadow = NextShadow;
3009   return cast<UsingDecl>(Shadow->UsingOrNextShadow);
3010 }
3011 
anchor()3012 void ConstructorUsingShadowDecl::anchor() {}
3013 
3014 ConstructorUsingShadowDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation Loc,UsingDecl * Using,NamedDecl * Target,bool IsVirtual)3015 ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
3016                                    SourceLocation Loc, UsingDecl *Using,
3017                                    NamedDecl *Target, bool IsVirtual) {
3018   return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
3019                                                 IsVirtual);
3020 }
3021 
3022 ConstructorUsingShadowDecl *
CreateDeserialized(ASTContext & C,unsigned ID)3023 ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3024   return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
3025 }
3026 
getNominatedBaseClass() const3027 CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
3028   return getUsingDecl()->getQualifier()->getAsRecordDecl();
3029 }
3030 
anchor()3031 void UsingDecl::anchor() {}
3032 
addShadowDecl(UsingShadowDecl * S)3033 void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
3034   assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
3035          "declaration already in set");
3036   assert(S->getUsingDecl() == this);
3037 
3038   if (FirstUsingShadow.getPointer())
3039     S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3040   FirstUsingShadow.setPointer(S);
3041 }
3042 
removeShadowDecl(UsingShadowDecl * S)3043 void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
3044   assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
3045          "declaration not in set");
3046   assert(S->getUsingDecl() == this);
3047 
3048   // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
3049 
3050   if (FirstUsingShadow.getPointer() == S) {
3051     FirstUsingShadow.setPointer(
3052       dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3053     S->UsingOrNextShadow = this;
3054     return;
3055   }
3056 
3057   UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
3058   while (Prev->UsingOrNextShadow != S)
3059     Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3060   Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3061   S->UsingOrNextShadow = this;
3062 }
3063 
Create(ASTContext & C,DeclContext * DC,SourceLocation UL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,bool HasTypename)3064 UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
3065                              NestedNameSpecifierLoc QualifierLoc,
3066                              const DeclarationNameInfo &NameInfo,
3067                              bool HasTypename) {
3068   return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3069 }
3070 
CreateDeserialized(ASTContext & C,unsigned ID)3071 UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3072   return new (C, ID) UsingDecl(nullptr, SourceLocation(),
3073                                NestedNameSpecifierLoc(), DeclarationNameInfo(),
3074                                false);
3075 }
3076 
getSourceRange() const3077 SourceRange UsingDecl::getSourceRange() const {
3078   SourceLocation Begin = isAccessDeclaration()
3079     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3080   return SourceRange(Begin, getNameInfo().getEndLoc());
3081 }
3082 
anchor()3083 void UsingPackDecl::anchor() {}
3084 
Create(ASTContext & C,DeclContext * DC,NamedDecl * InstantiatedFrom,ArrayRef<NamedDecl * > UsingDecls)3085 UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
3086                                      NamedDecl *InstantiatedFrom,
3087                                      ArrayRef<NamedDecl *> UsingDecls) {
3088   size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3089   return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3090 }
3091 
CreateDeserialized(ASTContext & C,unsigned ID,unsigned NumExpansions)3092 UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, unsigned ID,
3093                                                  unsigned NumExpansions) {
3094   size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3095   auto *Result = new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, None);
3096   Result->NumExpansions = NumExpansions;
3097   auto *Trail = Result->getTrailingObjects<NamedDecl *>();
3098   for (unsigned I = 0; I != NumExpansions; ++I)
3099     new (Trail + I) NamedDecl*(nullptr);
3100   return Result;
3101 }
3102 
anchor()3103 void UnresolvedUsingValueDecl::anchor() {}
3104 
3105 UnresolvedUsingValueDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,SourceLocation EllipsisLoc)3106 UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
3107                                  SourceLocation UsingLoc,
3108                                  NestedNameSpecifierLoc QualifierLoc,
3109                                  const DeclarationNameInfo &NameInfo,
3110                                  SourceLocation EllipsisLoc) {
3111   return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
3112                                               QualifierLoc, NameInfo,
3113                                               EllipsisLoc);
3114 }
3115 
3116 UnresolvedUsingValueDecl *
CreateDeserialized(ASTContext & C,unsigned ID)3117 UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3118   return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
3119                                               SourceLocation(),
3120                                               NestedNameSpecifierLoc(),
3121                                               DeclarationNameInfo(),
3122                                               SourceLocation());
3123 }
3124 
getSourceRange() const3125 SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
3126   SourceLocation Begin = isAccessDeclaration()
3127     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3128   return SourceRange(Begin, getNameInfo().getEndLoc());
3129 }
3130 
anchor()3131 void UnresolvedUsingTypenameDecl::anchor() {}
3132 
3133 UnresolvedUsingTypenameDecl *
Create(ASTContext & C,DeclContext * DC,SourceLocation UsingLoc,SourceLocation TypenameLoc,NestedNameSpecifierLoc QualifierLoc,SourceLocation TargetNameLoc,DeclarationName TargetName,SourceLocation EllipsisLoc)3134 UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
3135                                     SourceLocation UsingLoc,
3136                                     SourceLocation TypenameLoc,
3137                                     NestedNameSpecifierLoc QualifierLoc,
3138                                     SourceLocation TargetNameLoc,
3139                                     DeclarationName TargetName,
3140                                     SourceLocation EllipsisLoc) {
3141   return new (C, DC) UnresolvedUsingTypenameDecl(
3142       DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3143       TargetName.getAsIdentifierInfo(), EllipsisLoc);
3144 }
3145 
3146 UnresolvedUsingTypenameDecl *
CreateDeserialized(ASTContext & C,unsigned ID)3147 UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3148   return new (C, ID) UnresolvedUsingTypenameDecl(
3149       nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
3150       SourceLocation(), nullptr, SourceLocation());
3151 }
3152 
anchor()3153 void StaticAssertDecl::anchor() {}
3154 
Create(ASTContext & C,DeclContext * DC,SourceLocation StaticAssertLoc,Expr * AssertExpr,StringLiteral * Message,SourceLocation RParenLoc,bool Failed)3155 StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
3156                                            SourceLocation StaticAssertLoc,
3157                                            Expr *AssertExpr,
3158                                            StringLiteral *Message,
3159                                            SourceLocation RParenLoc,
3160                                            bool Failed) {
3161   return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
3162                                       RParenLoc, Failed);
3163 }
3164 
CreateDeserialized(ASTContext & C,unsigned ID)3165 StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
3166                                                        unsigned ID) {
3167   return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
3168                                       nullptr, SourceLocation(), false);
3169 }
3170 
anchor()3171 void BindingDecl::anchor() {}
3172 
Create(ASTContext & C,DeclContext * DC,SourceLocation IdLoc,IdentifierInfo * Id)3173 BindingDecl *BindingDecl::Create(ASTContext &C, DeclContext *DC,
3174                                  SourceLocation IdLoc, IdentifierInfo *Id) {
3175   return new (C, DC) BindingDecl(DC, IdLoc, Id);
3176 }
3177 
CreateDeserialized(ASTContext & C,unsigned ID)3178 BindingDecl *BindingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3179   return new (C, ID) BindingDecl(nullptr, SourceLocation(), nullptr);
3180 }
3181 
getHoldingVar() const3182 VarDecl *BindingDecl::getHoldingVar() const {
3183   Expr *B = getBinding();
3184   if (!B)
3185     return nullptr;
3186   auto *DRE = dyn_cast<DeclRefExpr>(B->IgnoreImplicit());
3187   if (!DRE)
3188     return nullptr;
3189 
3190   auto *VD = cast<VarDecl>(DRE->getDecl());
3191   assert(VD->isImplicit() && "holding var for binding decl not implicit");
3192   return VD;
3193 }
3194 
anchor()3195 void DecompositionDecl::anchor() {}
3196 
Create(ASTContext & C,DeclContext * DC,SourceLocation StartLoc,SourceLocation LSquareLoc,QualType T,TypeSourceInfo * TInfo,StorageClass SC,ArrayRef<BindingDecl * > Bindings)3197 DecompositionDecl *DecompositionDecl::Create(ASTContext &C, DeclContext *DC,
3198                                              SourceLocation StartLoc,
3199                                              SourceLocation LSquareLoc,
3200                                              QualType T, TypeSourceInfo *TInfo,
3201                                              StorageClass SC,
3202                                              ArrayRef<BindingDecl *> Bindings) {
3203   size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
3204   return new (C, DC, Extra)
3205       DecompositionDecl(C, DC, StartLoc, LSquareLoc, T, TInfo, SC, Bindings);
3206 }
3207 
CreateDeserialized(ASTContext & C,unsigned ID,unsigned NumBindings)3208 DecompositionDecl *DecompositionDecl::CreateDeserialized(ASTContext &C,
3209                                                          unsigned ID,
3210                                                          unsigned NumBindings) {
3211   size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3212   auto *Result = new (C, ID, Extra)
3213       DecompositionDecl(C, nullptr, SourceLocation(), SourceLocation(),
3214                         QualType(), nullptr, StorageClass(), None);
3215   // Set up and clean out the bindings array.
3216   Result->NumBindings = NumBindings;
3217   auto *Trail = Result->getTrailingObjects<BindingDecl *>();
3218   for (unsigned I = 0; I != NumBindings; ++I)
3219     new (Trail + I) BindingDecl*(nullptr);
3220   return Result;
3221 }
3222 
printName(llvm::raw_ostream & os) const3223 void DecompositionDecl::printName(llvm::raw_ostream &os) const {
3224   os << '[';
3225   bool Comma = false;
3226   for (const auto *B : bindings()) {
3227     if (Comma)
3228       os << ", ";
3229     B->printName(os);
3230     Comma = true;
3231   }
3232   os << ']';
3233 }
3234 
anchor()3235 void MSPropertyDecl::anchor() {}
3236 
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName N,QualType T,TypeSourceInfo * TInfo,SourceLocation StartL,IdentifierInfo * Getter,IdentifierInfo * Setter)3237 MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
3238                                        SourceLocation L, DeclarationName N,
3239                                        QualType T, TypeSourceInfo *TInfo,
3240                                        SourceLocation StartL,
3241                                        IdentifierInfo *Getter,
3242                                        IdentifierInfo *Setter) {
3243   return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3244 }
3245 
CreateDeserialized(ASTContext & C,unsigned ID)3246 MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
3247                                                    unsigned ID) {
3248   return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
3249                                     DeclarationName(), QualType(), nullptr,
3250                                     SourceLocation(), nullptr, nullptr);
3251 }
3252 
anchor()3253 void MSGuidDecl::anchor() {}
3254 
MSGuidDecl(DeclContext * DC,QualType T,Parts P)3255 MSGuidDecl::MSGuidDecl(DeclContext *DC, QualType T, Parts P)
3256     : ValueDecl(Decl::MSGuid, DC, SourceLocation(), DeclarationName(), T),
3257       PartVal(P), APVal() {}
3258 
Create(const ASTContext & C,QualType T,Parts P)3259 MSGuidDecl *MSGuidDecl::Create(const ASTContext &C, QualType T, Parts P) {
3260   DeclContext *DC = C.getTranslationUnitDecl();
3261   return new (C, DC) MSGuidDecl(DC, T, P);
3262 }
3263 
CreateDeserialized(ASTContext & C,unsigned ID)3264 MSGuidDecl *MSGuidDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3265   return new (C, ID) MSGuidDecl(nullptr, QualType(), Parts());
3266 }
3267 
printName(llvm::raw_ostream & OS) const3268 void MSGuidDecl::printName(llvm::raw_ostream &OS) const {
3269   OS << llvm::format("GUID{%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-",
3270                      PartVal.Part1, PartVal.Part2, PartVal.Part3);
3271   unsigned I = 0;
3272   for (uint8_t Byte : PartVal.Part4And5) {
3273     OS << llvm::format("%02" PRIx8, Byte);
3274     if (++I == 2)
3275       OS << '-';
3276   }
3277   OS << '}';
3278 }
3279 
3280 /// Determine if T is a valid 'struct _GUID' of the shape that we expect.
isValidStructGUID(ASTContext & Ctx,QualType T)3281 static bool isValidStructGUID(ASTContext &Ctx, QualType T) {
3282   // FIXME: We only need to check this once, not once each time we compute a
3283   // GUID APValue.
3284   using MatcherRef = llvm::function_ref<bool(QualType)>;
3285 
3286   auto IsInt = [&Ctx](unsigned N) {
3287     return [&Ctx, N](QualType T) {
3288       return T->isUnsignedIntegerOrEnumerationType() &&
3289              Ctx.getIntWidth(T) == N;
3290     };
3291   };
3292 
3293   auto IsArray = [&Ctx](MatcherRef Elem, unsigned N) {
3294     return [&Ctx, Elem, N](QualType T) {
3295       const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(T);
3296       return CAT && CAT->getSize() == N && Elem(CAT->getElementType());
3297     };
3298   };
3299 
3300   auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3301     return [Fields](QualType T) {
3302       const RecordDecl *RD = T->getAsRecordDecl();
3303       if (!RD || RD->isUnion())
3304         return false;
3305       RD = RD->getDefinition();
3306       if (!RD)
3307         return false;
3308       if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3309         if (CXXRD->getNumBases())
3310           return false;
3311       auto MatcherIt = Fields.begin();
3312       for (const FieldDecl *FD : RD->fields()) {
3313         if (FD->isUnnamedBitfield()) continue;
3314         if (FD->isBitField() || MatcherIt == Fields.end() ||
3315             !(*MatcherIt)(FD->getType()))
3316           return false;
3317         ++MatcherIt;
3318       }
3319       return MatcherIt == Fields.end();
3320     };
3321   };
3322 
3323   // We expect an {i32, i16, i16, [8 x i8]}.
3324   return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3325 }
3326 
getAsAPValue() const3327 APValue &MSGuidDecl::getAsAPValue() const {
3328   if (APVal.isAbsent() && isValidStructGUID(getASTContext(), getType())) {
3329     using llvm::APInt;
3330     using llvm::APSInt;
3331     APVal = APValue(APValue::UninitStruct(), 0, 4);
3332     APVal.getStructField(0) = APValue(APSInt(APInt(32, PartVal.Part1), true));
3333     APVal.getStructField(1) = APValue(APSInt(APInt(16, PartVal.Part2), true));
3334     APVal.getStructField(2) = APValue(APSInt(APInt(16, PartVal.Part3), true));
3335     APValue &Arr = APVal.getStructField(3) =
3336         APValue(APValue::UninitArray(), 8, 8);
3337     for (unsigned I = 0; I != 8; ++I) {
3338       Arr.getArrayInitializedElt(I) =
3339           APValue(APSInt(APInt(8, PartVal.Part4And5[I]), true));
3340     }
3341     // Register this APValue to be destroyed if necessary. (Note that the
3342     // MSGuidDecl destructor is never run.)
3343     getASTContext().addDestruction(&APVal);
3344   }
3345 
3346   return APVal;
3347 }
3348 
getAccessName(AccessSpecifier AS)3349 static const char *getAccessName(AccessSpecifier AS) {
3350   switch (AS) {
3351     case AS_none:
3352       llvm_unreachable("Invalid access specifier!");
3353     case AS_public:
3354       return "public";
3355     case AS_private:
3356       return "private";
3357     case AS_protected:
3358       return "protected";
3359   }
3360   llvm_unreachable("Invalid access specifier!");
3361 }
3362 
operator <<(const StreamingDiagnostic & DB,AccessSpecifier AS)3363 const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB,
3364                                              AccessSpecifier AS) {
3365   return DB << getAccessName(AS);
3366 }
3367