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 
58 void AccessSpecDecl::anchor() {}
59 
60 AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
61   return new (C, ID) AccessSpecDecl(EmptyShell());
62 }
63 
64 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 
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 
115 CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
116   return Bases.get(Definition->getASTContext().getExternalSource());
117 }
118 
119 CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
120   return VBases.get(Definition->getASTContext().getExternalSource());
121 }
122 
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 
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 *
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 *
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.
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
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 
488 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 
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 
556 bool CXXRecordDecl::hasConstexprDestructor() const {
557   auto *Dtor = getDestructor();
558   return Dtor ? Dtor->isConstexpr() : defaultedDestructorIsConstexpr();
559 }
560 
561 bool CXXRecordDecl::hasAnyDependentBases() const {
562   if (!isDependentContext())
563     return false;
564 
565   return !forallBases([](const CXXRecordDecl *) { return true; });
566 }
567 
568 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 
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 
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 
671 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 
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 
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 
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 
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 
1460 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 
1470 bool CXXRecordDecl::isGenericLambda() const {
1471   if (!isLambda()) return false;
1472   return getLambdaData().IsGenericLambda;
1473 }
1474 
1475 #ifndef NDEBUG
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 
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 
1496 FunctionTemplateDecl* CXXRecordDecl::getDependentLambdaCallOperator() const {
1497   NamedDecl *CallOp = getLambdaCallOperatorHelper(*this);
1498   return  dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1499 }
1500 
1501 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 
1513 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
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 
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 
1533 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 
1548 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 *
1567 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 *>
1576 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 
1590 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 
1596 void CXXRecordDecl::setDeviceLambdaManglingNumber(unsigned Num) const {
1597   assert(isLambda() && "Not a lambda closure type!");
1598   if (Num)
1599     getASTContext().DeviceLambdaManglingNumbers[this] = Num;
1600 }
1601 
1602 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 
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
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.
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>
1736 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 
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 
1779 CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1780   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1781     return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1782 
1783   return nullptr;
1784 }
1785 
1786 MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1787   return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1788 }
1789 
1790 void
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 
1800 ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1801   return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1802 }
1803 
1804 void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1805   TemplateOrInstantiation = Template;
1806 }
1807 
1808 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
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 
1833 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 
1878 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 
1891 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 
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 
1923 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 
1974 void CXXRecordDecl::completeDefinition() {
1975   completeDefinition(nullptr);
1976 }
1977 
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 
2019 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 
2034 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 
2046 void CXXDeductionGuideDecl::anchor() {}
2047 
2048 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 
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 *CXXDeductionGuideDecl::Create(
2077     ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2078     ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T,
2079     TypeSourceInfo *TInfo, SourceLocation EndLocation) {
2080   return new (C, DC) CXXDeductionGuideDecl(C, DC, StartLoc, ES, NameInfo, T,
2081                                            TInfo, EndLocation);
2082 }
2083 
2084 CXXDeductionGuideDecl *CXXDeductionGuideDecl::CreateDeserialized(ASTContext &C,
2085                                                                  unsigned ID) {
2086   return new (C, ID) CXXDeductionGuideDecl(
2087       C, nullptr, SourceLocation(), ExplicitSpecifier(), DeclarationNameInfo(),
2088       QualType(), nullptr, SourceLocation());
2089 }
2090 
2091 RequiresExprBodyDecl *RequiresExprBodyDecl::Create(
2092     ASTContext &C, DeclContext *DC, SourceLocation StartLoc) {
2093   return new (C, DC) RequiresExprBodyDecl(C, DC, StartLoc);
2094 }
2095 
2096 RequiresExprBodyDecl *RequiresExprBodyDecl::CreateDeserialized(ASTContext &C,
2097                                                                unsigned ID) {
2098   return new (C, ID) RequiresExprBodyDecl(C, nullptr, SourceLocation());
2099 }
2100 
2101 void CXXMethodDecl::anchor() {}
2102 
2103 bool CXXMethodDecl::isStatic() const {
2104   const CXXMethodDecl *MD = getCanonicalDecl();
2105 
2106   if (MD->getStorageClass() == SC_Static)
2107     return true;
2108 
2109   OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
2110   return isStaticOverloadedOperator(OOK);
2111 }
2112 
2113 static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
2114                                  const CXXMethodDecl *BaseMD) {
2115   for (const CXXMethodDecl *MD : DerivedMD->overridden_methods()) {
2116     if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
2117       return true;
2118     if (recursivelyOverrides(MD, BaseMD))
2119       return true;
2120   }
2121   return false;
2122 }
2123 
2124 CXXMethodDecl *
2125 CXXMethodDecl::getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD,
2126                                                      bool MayBeBase) {
2127   if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
2128     return this;
2129 
2130   // Lookup doesn't work for destructors, so handle them separately.
2131   if (isa<CXXDestructorDecl>(this)) {
2132     CXXMethodDecl *MD = RD->getDestructor();
2133     if (MD) {
2134       if (recursivelyOverrides(MD, this))
2135         return MD;
2136       if (MayBeBase && recursivelyOverrides(this, MD))
2137         return MD;
2138     }
2139     return nullptr;
2140   }
2141 
2142   for (auto *ND : RD->lookup(getDeclName())) {
2143     auto *MD = dyn_cast<CXXMethodDecl>(ND);
2144     if (!MD)
2145       continue;
2146     if (recursivelyOverrides(MD, this))
2147       return MD;
2148     if (MayBeBase && recursivelyOverrides(this, MD))
2149       return MD;
2150   }
2151 
2152   return nullptr;
2153 }
2154 
2155 CXXMethodDecl *
2156 CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
2157                                              bool MayBeBase) {
2158   if (auto *MD = getCorrespondingMethodDeclaredInClass(RD, MayBeBase))
2159     return MD;
2160 
2161   llvm::SmallVector<CXXMethodDecl*, 4> FinalOverriders;
2162   auto AddFinalOverrider = [&](CXXMethodDecl *D) {
2163     // If this function is overridden by a candidate final overrider, it is not
2164     // a final overrider.
2165     for (CXXMethodDecl *OtherD : FinalOverriders) {
2166       if (declaresSameEntity(D, OtherD) || recursivelyOverrides(OtherD, D))
2167         return;
2168     }
2169 
2170     // Other candidate final overriders might be overridden by this function.
2171     FinalOverriders.erase(
2172         std::remove_if(FinalOverriders.begin(), FinalOverriders.end(),
2173                        [&](CXXMethodDecl *OtherD) {
2174                          return recursivelyOverrides(D, OtherD);
2175                        }),
2176         FinalOverriders.end());
2177 
2178     FinalOverriders.push_back(D);
2179   };
2180 
2181   for (const auto &I : RD->bases()) {
2182     const RecordType *RT = I.getType()->getAs<RecordType>();
2183     if (!RT)
2184       continue;
2185     const auto *Base = cast<CXXRecordDecl>(RT->getDecl());
2186     if (CXXMethodDecl *D = this->getCorrespondingMethodInClass(Base))
2187       AddFinalOverrider(D);
2188   }
2189 
2190   return FinalOverriders.size() == 1 ? FinalOverriders.front() : nullptr;
2191 }
2192 
2193 CXXMethodDecl *CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
2194                                      SourceLocation StartLoc,
2195                                      const DeclarationNameInfo &NameInfo,
2196                                      QualType T, TypeSourceInfo *TInfo,
2197                                      StorageClass SC, bool isInline,
2198                                      ConstexprSpecKind ConstexprKind,
2199                                      SourceLocation EndLocation,
2200                                      Expr *TrailingRequiresClause) {
2201   return new (C, RD)
2202       CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo, T, TInfo, SC,
2203                     isInline, ConstexprKind, EndLocation,
2204                     TrailingRequiresClause);
2205 }
2206 
2207 CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2208   return new (C, ID)
2209       CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
2210                     DeclarationNameInfo(), QualType(), nullptr, SC_None, false,
2211                     ConstexprSpecKind::Unspecified, SourceLocation(), nullptr);
2212 }
2213 
2214 CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
2215                                                      bool IsAppleKext) {
2216   assert(isVirtual() && "this method is expected to be virtual");
2217 
2218   // When building with -fapple-kext, all calls must go through the vtable since
2219   // the kernel linker can do runtime patching of vtables.
2220   if (IsAppleKext)
2221     return nullptr;
2222 
2223   // If the member function is marked 'final', we know that it can't be
2224   // overridden and can therefore devirtualize it unless it's pure virtual.
2225   if (hasAttr<FinalAttr>())
2226     return isPure() ? nullptr : this;
2227 
2228   // If Base is unknown, we cannot devirtualize.
2229   if (!Base)
2230     return nullptr;
2231 
2232   // If the base expression (after skipping derived-to-base conversions) is a
2233   // class prvalue, then we can devirtualize.
2234   Base = Base->getBestDynamicClassTypeExpr();
2235   if (Base->isRValue() && Base->getType()->isRecordType())
2236     return this;
2237 
2238   // If we don't even know what we would call, we can't devirtualize.
2239   const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
2240   if (!BestDynamicDecl)
2241     return nullptr;
2242 
2243   // There may be a method corresponding to MD in a derived class.
2244   CXXMethodDecl *DevirtualizedMethod =
2245       getCorrespondingMethodInClass(BestDynamicDecl);
2246 
2247   // If there final overrider in the dynamic type is ambiguous, we can't
2248   // devirtualize this call.
2249   if (!DevirtualizedMethod)
2250     return nullptr;
2251 
2252   // If that method is pure virtual, we can't devirtualize. If this code is
2253   // reached, the result would be UB, not a direct call to the derived class
2254   // function, and we can't assume the derived class function is defined.
2255   if (DevirtualizedMethod->isPure())
2256     return nullptr;
2257 
2258   // If that method is marked final, we can devirtualize it.
2259   if (DevirtualizedMethod->hasAttr<FinalAttr>())
2260     return DevirtualizedMethod;
2261 
2262   // Similarly, if the class itself or its destructor is marked 'final',
2263   // the class can't be derived from and we can therefore devirtualize the
2264   // member function call.
2265   if (BestDynamicDecl->isEffectivelyFinal())
2266     return DevirtualizedMethod;
2267 
2268   if (const auto *DRE = dyn_cast<DeclRefExpr>(Base)) {
2269     if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2270       if (VD->getType()->isRecordType())
2271         // This is a record decl. We know the type and can devirtualize it.
2272         return DevirtualizedMethod;
2273 
2274     return nullptr;
2275   }
2276 
2277   // We can devirtualize calls on an object accessed by a class member access
2278   // expression, since by C++11 [basic.life]p6 we know that it can't refer to
2279   // a derived class object constructed in the same location.
2280   if (const auto *ME = dyn_cast<MemberExpr>(Base)) {
2281     const ValueDecl *VD = ME->getMemberDecl();
2282     return VD->getType()->isRecordType() ? DevirtualizedMethod : nullptr;
2283   }
2284 
2285   // Likewise for calls on an object accessed by a (non-reference) pointer to
2286   // member access.
2287   if (auto *BO = dyn_cast<BinaryOperator>(Base)) {
2288     if (BO->isPtrMemOp()) {
2289       auto *MPT = BO->getRHS()->getType()->castAs<MemberPointerType>();
2290       if (MPT->getPointeeType()->isRecordType())
2291         return DevirtualizedMethod;
2292     }
2293   }
2294 
2295   // We can't devirtualize the call.
2296   return nullptr;
2297 }
2298 
2299 bool CXXMethodDecl::isUsualDeallocationFunction(
2300     SmallVectorImpl<const FunctionDecl *> &PreventedBy) const {
2301   assert(PreventedBy.empty() && "PreventedBy is expected to be empty");
2302   if (getOverloadedOperator() != OO_Delete &&
2303       getOverloadedOperator() != OO_Array_Delete)
2304     return false;
2305 
2306   // C++ [basic.stc.dynamic.deallocation]p2:
2307   //   A template instance is never a usual deallocation function,
2308   //   regardless of its signature.
2309   if (getPrimaryTemplate())
2310     return false;
2311 
2312   // C++ [basic.stc.dynamic.deallocation]p2:
2313   //   If a class T has a member deallocation function named operator delete
2314   //   with exactly one parameter, then that function is a usual (non-placement)
2315   //   deallocation function. [...]
2316   if (getNumParams() == 1)
2317     return true;
2318   unsigned UsualParams = 1;
2319 
2320   // C++ P0722:
2321   //   A destroying operator delete is a usual deallocation function if
2322   //   removing the std::destroying_delete_t parameter and changing the
2323   //   first parameter type from T* to void* results in the signature of
2324   //   a usual deallocation function.
2325   if (isDestroyingOperatorDelete())
2326     ++UsualParams;
2327 
2328   // C++ <=14 [basic.stc.dynamic.deallocation]p2:
2329   //   [...] If class T does not declare such an operator delete but does
2330   //   declare a member deallocation function named operator delete with
2331   //   exactly two parameters, the second of which has type std::size_t (18.1),
2332   //   then this function is a usual deallocation function.
2333   //
2334   // C++17 says a usual deallocation function is one with the signature
2335   //   (void* [, size_t] [, std::align_val_t] [, ...])
2336   // and all such functions are usual deallocation functions. It's not clear
2337   // that allowing varargs functions was intentional.
2338   ASTContext &Context = getASTContext();
2339   if (UsualParams < getNumParams() &&
2340       Context.hasSameUnqualifiedType(getParamDecl(UsualParams)->getType(),
2341                                      Context.getSizeType()))
2342     ++UsualParams;
2343 
2344   if (UsualParams < getNumParams() &&
2345       getParamDecl(UsualParams)->getType()->isAlignValT())
2346     ++UsualParams;
2347 
2348   if (UsualParams != getNumParams())
2349     return false;
2350 
2351   // In C++17 onwards, all potential usual deallocation functions are actual
2352   // usual deallocation functions. Honor this behavior when post-C++14
2353   // deallocation functions are offered as extensions too.
2354   // FIXME(EricWF): Destrying Delete should be a language option. How do we
2355   // handle when destroying delete is used prior to C++17?
2356   if (Context.getLangOpts().CPlusPlus17 ||
2357       Context.getLangOpts().AlignedAllocation ||
2358       isDestroyingOperatorDelete())
2359     return true;
2360 
2361   // This function is a usual deallocation function if there are no
2362   // single-parameter deallocation functions of the same kind.
2363   DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
2364   bool Result = true;
2365   for (const auto *D : R) {
2366     if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2367       if (FD->getNumParams() == 1) {
2368         PreventedBy.push_back(FD);
2369         Result = false;
2370       }
2371     }
2372   }
2373   return Result;
2374 }
2375 
2376 bool CXXMethodDecl::isCopyAssignmentOperator() const {
2377   // C++0x [class.copy]p17:
2378   //  A user-declared copy assignment operator X::operator= is a non-static
2379   //  non-template member function of class X with exactly one parameter of
2380   //  type X, X&, const X&, volatile X& or const volatile X&.
2381   if (/*operator=*/getOverloadedOperator() != OO_Equal ||
2382       /*non-static*/ isStatic() ||
2383       /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2384       getNumParams() != 1)
2385     return false;
2386 
2387   QualType ParamType = getParamDecl(0)->getType();
2388   if (const auto *Ref = ParamType->getAs<LValueReferenceType>())
2389     ParamType = Ref->getPointeeType();
2390 
2391   ASTContext &Context = getASTContext();
2392   QualType ClassType
2393     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2394   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2395 }
2396 
2397 bool CXXMethodDecl::isMoveAssignmentOperator() const {
2398   // C++0x [class.copy]p19:
2399   //  A user-declared move assignment operator X::operator= is a non-static
2400   //  non-template member function of class X with exactly one parameter of type
2401   //  X&&, const X&&, volatile X&&, or const volatile X&&.
2402   if (getOverloadedOperator() != OO_Equal || isStatic() ||
2403       getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2404       getNumParams() != 1)
2405     return false;
2406 
2407   QualType ParamType = getParamDecl(0)->getType();
2408   if (!isa<RValueReferenceType>(ParamType))
2409     return false;
2410   ParamType = ParamType->getPointeeType();
2411 
2412   ASTContext &Context = getASTContext();
2413   QualType ClassType
2414     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2415   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2416 }
2417 
2418 void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
2419   assert(MD->isCanonicalDecl() && "Method is not canonical!");
2420   assert(!MD->getParent()->isDependentContext() &&
2421          "Can't add an overridden method to a class template!");
2422   assert(MD->isVirtual() && "Method is not virtual!");
2423 
2424   getASTContext().addOverriddenMethod(this, MD);
2425 }
2426 
2427 CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
2428   if (isa<CXXConstructorDecl>(this)) return nullptr;
2429   return getASTContext().overridden_methods_begin(this);
2430 }
2431 
2432 CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
2433   if (isa<CXXConstructorDecl>(this)) return nullptr;
2434   return getASTContext().overridden_methods_end(this);
2435 }
2436 
2437 unsigned CXXMethodDecl::size_overridden_methods() const {
2438   if (isa<CXXConstructorDecl>(this)) return 0;
2439   return getASTContext().overridden_methods_size(this);
2440 }
2441 
2442 CXXMethodDecl::overridden_method_range
2443 CXXMethodDecl::overridden_methods() const {
2444   if (isa<CXXConstructorDecl>(this))
2445     return overridden_method_range(nullptr, nullptr);
2446   return getASTContext().overridden_methods(this);
2447 }
2448 
2449 static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT,
2450                                   const CXXRecordDecl *Decl) {
2451   QualType ClassTy = C.getTypeDeclType(Decl);
2452   return C.getQualifiedType(ClassTy, FPT->getMethodQuals());
2453 }
2454 
2455 QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT,
2456                                     const CXXRecordDecl *Decl) {
2457   ASTContext &C = Decl->getASTContext();
2458   QualType ObjectTy = ::getThisObjectType(C, FPT, Decl);
2459   return C.getPointerType(ObjectTy);
2460 }
2461 
2462 QualType CXXMethodDecl::getThisObjectType(const FunctionProtoType *FPT,
2463                                           const CXXRecordDecl *Decl) {
2464   ASTContext &C = Decl->getASTContext();
2465   return ::getThisObjectType(C, FPT, Decl);
2466 }
2467 
2468 QualType CXXMethodDecl::getThisType() const {
2469   // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
2470   // If the member function is declared const, the type of this is const X*,
2471   // if the member function is declared volatile, the type of this is
2472   // volatile X*, and if the member function is declared const volatile,
2473   // the type of this is const volatile X*.
2474   assert(isInstance() && "No 'this' for static methods!");
2475   return CXXMethodDecl::getThisType(getType()->castAs<FunctionProtoType>(),
2476                                     getParent());
2477 }
2478 
2479 QualType CXXMethodDecl::getThisObjectType() const {
2480   // Ditto getThisType.
2481   assert(isInstance() && "No 'this' for static methods!");
2482   return CXXMethodDecl::getThisObjectType(
2483       getType()->castAs<FunctionProtoType>(), getParent());
2484 }
2485 
2486 bool CXXMethodDecl::hasInlineBody() const {
2487   // If this function is a template instantiation, look at the template from
2488   // which it was instantiated.
2489   const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
2490   if (!CheckFn)
2491     CheckFn = this;
2492 
2493   const FunctionDecl *fn;
2494   return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
2495          (fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
2496 }
2497 
2498 bool CXXMethodDecl::isLambdaStaticInvoker() const {
2499   const CXXRecordDecl *P = getParent();
2500   return P->isLambda() && getDeclName().isIdentifier() &&
2501          getName() == getLambdaStaticInvokerName();
2502 }
2503 
2504 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2505                                        TypeSourceInfo *TInfo, bool IsVirtual,
2506                                        SourceLocation L, Expr *Init,
2507                                        SourceLocation R,
2508                                        SourceLocation EllipsisLoc)
2509     : Initializee(TInfo), Init(Init), MemberOrEllipsisLocation(EllipsisLoc),
2510       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
2511       IsWritten(false), SourceOrder(0) {}
2512 
2513 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
2514                                        SourceLocation MemberLoc,
2515                                        SourceLocation L, Expr *Init,
2516                                        SourceLocation R)
2517     : Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2518       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2519       IsWritten(false), SourceOrder(0) {}
2520 
2521 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2522                                        IndirectFieldDecl *Member,
2523                                        SourceLocation MemberLoc,
2524                                        SourceLocation L, Expr *Init,
2525                                        SourceLocation R)
2526     : Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2527       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2528       IsWritten(false), SourceOrder(0) {}
2529 
2530 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2531                                        TypeSourceInfo *TInfo,
2532                                        SourceLocation L, Expr *Init,
2533                                        SourceLocation R)
2534     : Initializee(TInfo), Init(Init), LParenLoc(L), RParenLoc(R),
2535       IsDelegating(true), IsVirtual(false), IsWritten(false), SourceOrder(0) {}
2536 
2537 int64_t CXXCtorInitializer::getID(const ASTContext &Context) const {
2538   return Context.getAllocator()
2539                 .identifyKnownAlignedObject<CXXCtorInitializer>(this);
2540 }
2541 
2542 TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
2543   if (isBaseInitializer())
2544     return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
2545   else
2546     return {};
2547 }
2548 
2549 const Type *CXXCtorInitializer::getBaseClass() const {
2550   if (isBaseInitializer())
2551     return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
2552   else
2553     return nullptr;
2554 }
2555 
2556 SourceLocation CXXCtorInitializer::getSourceLocation() const {
2557   if (isInClassMemberInitializer())
2558     return getAnyMember()->getLocation();
2559 
2560   if (isAnyMemberInitializer())
2561     return getMemberLocation();
2562 
2563   if (const auto *TSInfo = Initializee.get<TypeSourceInfo *>())
2564     return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
2565 
2566   return {};
2567 }
2568 
2569 SourceRange CXXCtorInitializer::getSourceRange() const {
2570   if (isInClassMemberInitializer()) {
2571     FieldDecl *D = getAnyMember();
2572     if (Expr *I = D->getInClassInitializer())
2573       return I->getSourceRange();
2574     return {};
2575   }
2576 
2577   return SourceRange(getSourceLocation(), getRParenLoc());
2578 }
2579 
2580 CXXConstructorDecl::CXXConstructorDecl(
2581     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2582     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2583     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2584     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2585     Expr *TrailingRequiresClause)
2586     : CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2587                     SC_None, isInline, ConstexprKind, SourceLocation(),
2588                     TrailingRequiresClause) {
2589   setNumCtorInitializers(0);
2590   setInheritingConstructor(static_cast<bool>(Inherited));
2591   setImplicit(isImplicitlyDeclared);
2592   CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.getExpr() ? 1 : 0;
2593   if (Inherited)
2594     *getTrailingObjects<InheritedConstructor>() = Inherited;
2595   setExplicitSpecifier(ES);
2596 }
2597 
2598 void CXXConstructorDecl::anchor() {}
2599 
2600 CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
2601                                                            unsigned ID,
2602                                                            uint64_t AllocKind) {
2603   bool hasTraillingExplicit = static_cast<bool>(AllocKind & TAKHasTailExplicit);
2604   bool isInheritingConstructor =
2605       static_cast<bool>(AllocKind & TAKInheritsConstructor);
2606   unsigned Extra =
2607       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2608           isInheritingConstructor, hasTraillingExplicit);
2609   auto *Result = new (C, ID, Extra) CXXConstructorDecl(
2610       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2611       ExplicitSpecifier(), false, false, ConstexprSpecKind::Unspecified,
2612       InheritedConstructor(), nullptr);
2613   Result->setInheritingConstructor(isInheritingConstructor);
2614   Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2615       hasTraillingExplicit;
2616   Result->setExplicitSpecifier(ExplicitSpecifier());
2617   return Result;
2618 }
2619 
2620 CXXConstructorDecl *CXXConstructorDecl::Create(
2621     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2622     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2623     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2624     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2625     Expr *TrailingRequiresClause) {
2626   assert(NameInfo.getName().getNameKind()
2627          == DeclarationName::CXXConstructorName &&
2628          "Name must refer to a constructor");
2629   unsigned Extra =
2630       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2631           Inherited ? 1 : 0, ES.getExpr() ? 1 : 0);
2632   return new (C, RD, Extra)
2633       CXXConstructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, ES, isInline,
2634                          isImplicitlyDeclared, ConstexprKind, Inherited,
2635                          TrailingRequiresClause);
2636 }
2637 
2638 CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
2639   return CtorInitializers.get(getASTContext().getExternalSource());
2640 }
2641 
2642 CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
2643   assert(isDelegatingConstructor() && "Not a delegating constructor!");
2644   Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
2645   if (const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2646     return Construct->getConstructor();
2647 
2648   return nullptr;
2649 }
2650 
2651 bool CXXConstructorDecl::isDefaultConstructor() const {
2652   // C++ [class.default.ctor]p1:
2653   //   A default constructor for a class X is a constructor of class X for
2654   //   which each parameter that is not a function parameter pack has a default
2655   //   argument (including the case of a constructor with no parameters)
2656   return getMinRequiredArguments() == 0;
2657 }
2658 
2659 bool
2660 CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
2661   return isCopyOrMoveConstructor(TypeQuals) &&
2662          getParamDecl(0)->getType()->isLValueReferenceType();
2663 }
2664 
2665 bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
2666   return isCopyOrMoveConstructor(TypeQuals) &&
2667          getParamDecl(0)->getType()->isRValueReferenceType();
2668 }
2669 
2670 /// Determine whether this is a copy or move constructor.
2671 bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
2672   // C++ [class.copy]p2:
2673   //   A non-template constructor for class X is a copy constructor
2674   //   if its first parameter is of type X&, const X&, volatile X& or
2675   //   const volatile X&, and either there are no other parameters
2676   //   or else all other parameters have default arguments (8.3.6).
2677   // C++0x [class.copy]p3:
2678   //   A non-template constructor for class X is a move constructor if its
2679   //   first parameter is of type X&&, const X&&, volatile X&&, or
2680   //   const volatile X&&, and either there are no other parameters or else
2681   //   all other parameters have default arguments.
2682   if (!hasOneParamOrDefaultArgs() || getPrimaryTemplate() != nullptr ||
2683       getDescribedFunctionTemplate() != nullptr)
2684     return false;
2685 
2686   const ParmVarDecl *Param = getParamDecl(0);
2687 
2688   // Do we have a reference type?
2689   const auto *ParamRefType = Param->getType()->getAs<ReferenceType>();
2690   if (!ParamRefType)
2691     return false;
2692 
2693   // Is it a reference to our class type?
2694   ASTContext &Context = getASTContext();
2695 
2696   CanQualType PointeeType
2697     = Context.getCanonicalType(ParamRefType->getPointeeType());
2698   CanQualType ClassTy
2699     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2700   if (PointeeType.getUnqualifiedType() != ClassTy)
2701     return false;
2702 
2703   // FIXME: other qualifiers?
2704 
2705   // We have a copy or move constructor.
2706   TypeQuals = PointeeType.getCVRQualifiers();
2707   return true;
2708 }
2709 
2710 bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
2711   // C++ [class.conv.ctor]p1:
2712   //   A constructor declared without the function-specifier explicit
2713   //   that can be called with a single parameter specifies a
2714   //   conversion from the type of its first parameter to the type of
2715   //   its class. Such a constructor is called a converting
2716   //   constructor.
2717   if (isExplicit() && !AllowExplicit)
2718     return false;
2719 
2720   // FIXME: This has nothing to do with the definition of converting
2721   // constructor, but is convenient for how we use this function in overload
2722   // resolution.
2723   return getNumParams() == 0
2724              ? getType()->castAs<FunctionProtoType>()->isVariadic()
2725              : getMinRequiredArguments() <= 1;
2726 }
2727 
2728 bool CXXConstructorDecl::isSpecializationCopyingObject() const {
2729   if (!hasOneParamOrDefaultArgs() || getDescribedFunctionTemplate() != nullptr)
2730     return false;
2731 
2732   const ParmVarDecl *Param = getParamDecl(0);
2733 
2734   ASTContext &Context = getASTContext();
2735   CanQualType ParamType = Context.getCanonicalType(Param->getType());
2736 
2737   // Is it the same as our class type?
2738   CanQualType ClassTy
2739     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2740   if (ParamType.getUnqualifiedType() != ClassTy)
2741     return false;
2742 
2743   return true;
2744 }
2745 
2746 void CXXDestructorDecl::anchor() {}
2747 
2748 CXXDestructorDecl *
2749 CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2750   return new (C, ID) CXXDestructorDecl(
2751       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2752       false, false, ConstexprSpecKind::Unspecified, nullptr);
2753 }
2754 
2755 CXXDestructorDecl *CXXDestructorDecl::Create(
2756     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2757     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2758     bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2759     Expr *TrailingRequiresClause) {
2760   assert(NameInfo.getName().getNameKind()
2761          == DeclarationName::CXXDestructorName &&
2762          "Name must refer to a destructor");
2763   return new (C, RD)
2764       CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline,
2765                         isImplicitlyDeclared, ConstexprKind,
2766                         TrailingRequiresClause);
2767 }
2768 
2769 void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
2770   auto *First = cast<CXXDestructorDecl>(getFirstDecl());
2771   if (OD && !First->OperatorDelete) {
2772     First->OperatorDelete = OD;
2773     First->OperatorDeleteThisArg = ThisArg;
2774     if (auto *L = getASTMutationListener())
2775       L->ResolvedOperatorDelete(First, OD, ThisArg);
2776   }
2777 }
2778 
2779 void CXXConversionDecl::anchor() {}
2780 
2781 CXXConversionDecl *
2782 CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2783   return new (C, ID) CXXConversionDecl(
2784       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2785       false, ExplicitSpecifier(), ConstexprSpecKind::Unspecified,
2786       SourceLocation(), nullptr);
2787 }
2788 
2789 CXXConversionDecl *CXXConversionDecl::Create(
2790     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2791     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2792     bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind,
2793     SourceLocation EndLocation, Expr *TrailingRequiresClause) {
2794   assert(NameInfo.getName().getNameKind()
2795          == DeclarationName::CXXConversionFunctionName &&
2796          "Name must refer to a conversion function");
2797   return new (C, RD)
2798       CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline, ES,
2799                         ConstexprKind, EndLocation, TrailingRequiresClause);
2800 }
2801 
2802 bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2803   return isImplicit() && getParent()->isLambda() &&
2804          getConversionType()->isBlockPointerType();
2805 }
2806 
2807 LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
2808                                  SourceLocation LangLoc, LanguageIDs lang,
2809                                  bool HasBraces)
2810     : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
2811       ExternLoc(ExternLoc), RBraceLoc(SourceLocation()) {
2812   setLanguage(lang);
2813   LinkageSpecDeclBits.HasBraces = HasBraces;
2814 }
2815 
2816 void LinkageSpecDecl::anchor() {}
2817 
2818 LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
2819                                          DeclContext *DC,
2820                                          SourceLocation ExternLoc,
2821                                          SourceLocation LangLoc,
2822                                          LanguageIDs Lang,
2823                                          bool HasBraces) {
2824   return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2825 }
2826 
2827 LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2828                                                      unsigned ID) {
2829   return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
2830                                      SourceLocation(), lang_c, false);
2831 }
2832 
2833 void UsingDirectiveDecl::anchor() {}
2834 
2835 UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2836                                                SourceLocation L,
2837                                                SourceLocation NamespaceLoc,
2838                                            NestedNameSpecifierLoc QualifierLoc,
2839                                                SourceLocation IdentLoc,
2840                                                NamedDecl *Used,
2841                                                DeclContext *CommonAncestor) {
2842   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2843     Used = NS->getOriginalNamespace();
2844   return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2845                                         IdentLoc, Used, CommonAncestor);
2846 }
2847 
2848 UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2849                                                            unsigned ID) {
2850   return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2851                                         SourceLocation(),
2852                                         NestedNameSpecifierLoc(),
2853                                         SourceLocation(), nullptr, nullptr);
2854 }
2855 
2856 NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2857   if (auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2858     return NA->getNamespace();
2859   return cast_or_null<NamespaceDecl>(NominatedNamespace);
2860 }
2861 
2862 NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
2863                              SourceLocation StartLoc, SourceLocation IdLoc,
2864                              IdentifierInfo *Id, NamespaceDecl *PrevDecl)
2865     : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
2866       redeclarable_base(C), LocStart(StartLoc),
2867       AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2868   setPreviousDecl(PrevDecl);
2869 
2870   if (PrevDecl)
2871     AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2872 }
2873 
2874 NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2875                                      bool Inline, SourceLocation StartLoc,
2876                                      SourceLocation IdLoc, IdentifierInfo *Id,
2877                                      NamespaceDecl *PrevDecl) {
2878   return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
2879                                    PrevDecl);
2880 }
2881 
2882 NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2883   return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
2884                                    SourceLocation(), nullptr, nullptr);
2885 }
2886 
2887 NamespaceDecl *NamespaceDecl::getOriginalNamespace() {
2888   if (isFirstDecl())
2889     return this;
2890 
2891   return AnonOrFirstNamespaceAndInline.getPointer();
2892 }
2893 
2894 const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
2895   if (isFirstDecl())
2896     return this;
2897 
2898   return AnonOrFirstNamespaceAndInline.getPointer();
2899 }
2900 
2901 bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
2902 
2903 NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
2904   return getNextRedeclaration();
2905 }
2906 
2907 NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2908   return getPreviousDecl();
2909 }
2910 
2911 NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2912   return getMostRecentDecl();
2913 }
2914 
2915 void NamespaceAliasDecl::anchor() {}
2916 
2917 NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2918   return getNextRedeclaration();
2919 }
2920 
2921 NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2922   return getPreviousDecl();
2923 }
2924 
2925 NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2926   return getMostRecentDecl();
2927 }
2928 
2929 NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
2930                                                SourceLocation UsingLoc,
2931                                                SourceLocation AliasLoc,
2932                                                IdentifierInfo *Alias,
2933                                            NestedNameSpecifierLoc QualifierLoc,
2934                                                SourceLocation IdentLoc,
2935                                                NamedDecl *Namespace) {
2936   // FIXME: Preserve the aliased namespace as written.
2937   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2938     Namespace = NS->getOriginalNamespace();
2939   return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
2940                                         QualifierLoc, IdentLoc, Namespace);
2941 }
2942 
2943 NamespaceAliasDecl *
2944 NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2945   return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
2946                                         SourceLocation(), nullptr,
2947                                         NestedNameSpecifierLoc(),
2948                                         SourceLocation(), nullptr);
2949 }
2950 
2951 void LifetimeExtendedTemporaryDecl::anchor() {}
2952 
2953 /// Retrieve the storage duration for the materialized temporary.
2954 StorageDuration LifetimeExtendedTemporaryDecl::getStorageDuration() const {
2955   const ValueDecl *ExtendingDecl = getExtendingDecl();
2956   if (!ExtendingDecl)
2957     return SD_FullExpression;
2958   // FIXME: This is not necessarily correct for a temporary materialized
2959   // within a default initializer.
2960   if (isa<FieldDecl>(ExtendingDecl))
2961     return SD_Automatic;
2962   // FIXME: This only works because storage class specifiers are not allowed
2963   // on decomposition declarations.
2964   if (isa<BindingDecl>(ExtendingDecl))
2965     return ExtendingDecl->getDeclContext()->isFunctionOrMethod() ? SD_Automatic
2966                                                                  : SD_Static;
2967   return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
2968 }
2969 
2970 APValue *LifetimeExtendedTemporaryDecl::getOrCreateValue(bool MayCreate) const {
2971   assert(getStorageDuration() == SD_Static &&
2972          "don't need to cache the computed value for this temporary");
2973   if (MayCreate && !Value) {
2974     Value = (new (getASTContext()) APValue);
2975     getASTContext().addDestruction(Value);
2976   }
2977   assert(Value && "may not be null");
2978   return Value;
2979 }
2980 
2981 void UsingShadowDecl::anchor() {}
2982 
2983 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
2984                                  SourceLocation Loc, UsingDecl *Using,
2985                                  NamedDecl *Target)
2986     : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
2987       redeclarable_base(C), UsingOrNextShadow(cast<NamedDecl>(Using)) {
2988   if (Target)
2989     setTargetDecl(Target);
2990   setImplicit();
2991 }
2992 
2993 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
2994     : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
2995       redeclarable_base(C) {}
2996 
2997 UsingShadowDecl *
2998 UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2999   return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
3000 }
3001 
3002 UsingDecl *UsingShadowDecl::getUsingDecl() const {
3003   const UsingShadowDecl *Shadow = this;
3004   while (const auto *NextShadow =
3005              dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3006     Shadow = NextShadow;
3007   return cast<UsingDecl>(Shadow->UsingOrNextShadow);
3008 }
3009 
3010 void ConstructorUsingShadowDecl::anchor() {}
3011 
3012 ConstructorUsingShadowDecl *
3013 ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
3014                                    SourceLocation Loc, UsingDecl *Using,
3015                                    NamedDecl *Target, bool IsVirtual) {
3016   return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
3017                                                 IsVirtual);
3018 }
3019 
3020 ConstructorUsingShadowDecl *
3021 ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3022   return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
3023 }
3024 
3025 CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
3026   return getUsingDecl()->getQualifier()->getAsRecordDecl();
3027 }
3028 
3029 void UsingDecl::anchor() {}
3030 
3031 void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
3032   assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
3033          "declaration already in set");
3034   assert(S->getUsingDecl() == this);
3035 
3036   if (FirstUsingShadow.getPointer())
3037     S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3038   FirstUsingShadow.setPointer(S);
3039 }
3040 
3041 void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
3042   assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
3043          "declaration not in set");
3044   assert(S->getUsingDecl() == this);
3045 
3046   // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
3047 
3048   if (FirstUsingShadow.getPointer() == S) {
3049     FirstUsingShadow.setPointer(
3050       dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3051     S->UsingOrNextShadow = this;
3052     return;
3053   }
3054 
3055   UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
3056   while (Prev->UsingOrNextShadow != S)
3057     Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3058   Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3059   S->UsingOrNextShadow = this;
3060 }
3061 
3062 UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
3063                              NestedNameSpecifierLoc QualifierLoc,
3064                              const DeclarationNameInfo &NameInfo,
3065                              bool HasTypename) {
3066   return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3067 }
3068 
3069 UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3070   return new (C, ID) UsingDecl(nullptr, SourceLocation(),
3071                                NestedNameSpecifierLoc(), DeclarationNameInfo(),
3072                                false);
3073 }
3074 
3075 SourceRange UsingDecl::getSourceRange() const {
3076   SourceLocation Begin = isAccessDeclaration()
3077     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3078   return SourceRange(Begin, getNameInfo().getEndLoc());
3079 }
3080 
3081 void UsingPackDecl::anchor() {}
3082 
3083 UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
3084                                      NamedDecl *InstantiatedFrom,
3085                                      ArrayRef<NamedDecl *> UsingDecls) {
3086   size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3087   return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3088 }
3089 
3090 UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, unsigned ID,
3091                                                  unsigned NumExpansions) {
3092   size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3093   auto *Result = new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, None);
3094   Result->NumExpansions = NumExpansions;
3095   auto *Trail = Result->getTrailingObjects<NamedDecl *>();
3096   for (unsigned I = 0; I != NumExpansions; ++I)
3097     new (Trail + I) NamedDecl*(nullptr);
3098   return Result;
3099 }
3100 
3101 void UnresolvedUsingValueDecl::anchor() {}
3102 
3103 UnresolvedUsingValueDecl *
3104 UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
3105                                  SourceLocation UsingLoc,
3106                                  NestedNameSpecifierLoc QualifierLoc,
3107                                  const DeclarationNameInfo &NameInfo,
3108                                  SourceLocation EllipsisLoc) {
3109   return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
3110                                               QualifierLoc, NameInfo,
3111                                               EllipsisLoc);
3112 }
3113 
3114 UnresolvedUsingValueDecl *
3115 UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3116   return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
3117                                               SourceLocation(),
3118                                               NestedNameSpecifierLoc(),
3119                                               DeclarationNameInfo(),
3120                                               SourceLocation());
3121 }
3122 
3123 SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
3124   SourceLocation Begin = isAccessDeclaration()
3125     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3126   return SourceRange(Begin, getNameInfo().getEndLoc());
3127 }
3128 
3129 void UnresolvedUsingTypenameDecl::anchor() {}
3130 
3131 UnresolvedUsingTypenameDecl *
3132 UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
3133                                     SourceLocation UsingLoc,
3134                                     SourceLocation TypenameLoc,
3135                                     NestedNameSpecifierLoc QualifierLoc,
3136                                     SourceLocation TargetNameLoc,
3137                                     DeclarationName TargetName,
3138                                     SourceLocation EllipsisLoc) {
3139   return new (C, DC) UnresolvedUsingTypenameDecl(
3140       DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3141       TargetName.getAsIdentifierInfo(), EllipsisLoc);
3142 }
3143 
3144 UnresolvedUsingTypenameDecl *
3145 UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3146   return new (C, ID) UnresolvedUsingTypenameDecl(
3147       nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
3148       SourceLocation(), nullptr, SourceLocation());
3149 }
3150 
3151 void StaticAssertDecl::anchor() {}
3152 
3153 StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
3154                                            SourceLocation StaticAssertLoc,
3155                                            Expr *AssertExpr,
3156                                            StringLiteral *Message,
3157                                            SourceLocation RParenLoc,
3158                                            bool Failed) {
3159   return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
3160                                       RParenLoc, Failed);
3161 }
3162 
3163 StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
3164                                                        unsigned ID) {
3165   return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
3166                                       nullptr, SourceLocation(), false);
3167 }
3168 
3169 void BindingDecl::anchor() {}
3170 
3171 BindingDecl *BindingDecl::Create(ASTContext &C, DeclContext *DC,
3172                                  SourceLocation IdLoc, IdentifierInfo *Id) {
3173   return new (C, DC) BindingDecl(DC, IdLoc, Id);
3174 }
3175 
3176 BindingDecl *BindingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3177   return new (C, ID) BindingDecl(nullptr, SourceLocation(), nullptr);
3178 }
3179 
3180 ValueDecl *BindingDecl::getDecomposedDecl() const {
3181   ExternalASTSource *Source =
3182       Decomp.isOffset() ? getASTContext().getExternalSource() : nullptr;
3183   return cast_or_null<ValueDecl>(Decomp.get(Source));
3184 }
3185 
3186 VarDecl *BindingDecl::getHoldingVar() const {
3187   Expr *B = getBinding();
3188   if (!B)
3189     return nullptr;
3190   auto *DRE = dyn_cast<DeclRefExpr>(B->IgnoreImplicit());
3191   if (!DRE)
3192     return nullptr;
3193 
3194   auto *VD = cast<VarDecl>(DRE->getDecl());
3195   assert(VD->isImplicit() && "holding var for binding decl not implicit");
3196   return VD;
3197 }
3198 
3199 void DecompositionDecl::anchor() {}
3200 
3201 DecompositionDecl *DecompositionDecl::Create(ASTContext &C, DeclContext *DC,
3202                                              SourceLocation StartLoc,
3203                                              SourceLocation LSquareLoc,
3204                                              QualType T, TypeSourceInfo *TInfo,
3205                                              StorageClass SC,
3206                                              ArrayRef<BindingDecl *> Bindings) {
3207   size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
3208   return new (C, DC, Extra)
3209       DecompositionDecl(C, DC, StartLoc, LSquareLoc, T, TInfo, SC, Bindings);
3210 }
3211 
3212 DecompositionDecl *DecompositionDecl::CreateDeserialized(ASTContext &C,
3213                                                          unsigned ID,
3214                                                          unsigned NumBindings) {
3215   size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3216   auto *Result = new (C, ID, Extra)
3217       DecompositionDecl(C, nullptr, SourceLocation(), SourceLocation(),
3218                         QualType(), nullptr, StorageClass(), None);
3219   // Set up and clean out the bindings array.
3220   Result->NumBindings = NumBindings;
3221   auto *Trail = Result->getTrailingObjects<BindingDecl *>();
3222   for (unsigned I = 0; I != NumBindings; ++I)
3223     new (Trail + I) BindingDecl*(nullptr);
3224   return Result;
3225 }
3226 
3227 void DecompositionDecl::printName(llvm::raw_ostream &os) const {
3228   os << '[';
3229   bool Comma = false;
3230   for (const auto *B : bindings()) {
3231     if (Comma)
3232       os << ", ";
3233     B->printName(os);
3234     Comma = true;
3235   }
3236   os << ']';
3237 }
3238 
3239 void MSPropertyDecl::anchor() {}
3240 
3241 MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
3242                                        SourceLocation L, DeclarationName N,
3243                                        QualType T, TypeSourceInfo *TInfo,
3244                                        SourceLocation StartL,
3245                                        IdentifierInfo *Getter,
3246                                        IdentifierInfo *Setter) {
3247   return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3248 }
3249 
3250 MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
3251                                                    unsigned ID) {
3252   return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
3253                                     DeclarationName(), QualType(), nullptr,
3254                                     SourceLocation(), nullptr, nullptr);
3255 }
3256 
3257 void MSGuidDecl::anchor() {}
3258 
3259 MSGuidDecl::MSGuidDecl(DeclContext *DC, QualType T, Parts P)
3260     : ValueDecl(Decl::MSGuid, DC, SourceLocation(), DeclarationName(), T),
3261       PartVal(P), APVal() {}
3262 
3263 MSGuidDecl *MSGuidDecl::Create(const ASTContext &C, QualType T, Parts P) {
3264   DeclContext *DC = C.getTranslationUnitDecl();
3265   return new (C, DC) MSGuidDecl(DC, T, P);
3266 }
3267 
3268 MSGuidDecl *MSGuidDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3269   return new (C, ID) MSGuidDecl(nullptr, QualType(), Parts());
3270 }
3271 
3272 void MSGuidDecl::printName(llvm::raw_ostream &OS) const {
3273   OS << llvm::format("GUID{%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-",
3274                      PartVal.Part1, PartVal.Part2, PartVal.Part3);
3275   unsigned I = 0;
3276   for (uint8_t Byte : PartVal.Part4And5) {
3277     OS << llvm::format("%02" PRIx8, Byte);
3278     if (++I == 2)
3279       OS << '-';
3280   }
3281   OS << '}';
3282 }
3283 
3284 /// Determine if T is a valid 'struct _GUID' of the shape that we expect.
3285 static bool isValidStructGUID(ASTContext &Ctx, QualType T) {
3286   // FIXME: We only need to check this once, not once each time we compute a
3287   // GUID APValue.
3288   using MatcherRef = llvm::function_ref<bool(QualType)>;
3289 
3290   auto IsInt = [&Ctx](unsigned N) {
3291     return [&Ctx, N](QualType T) {
3292       return T->isUnsignedIntegerOrEnumerationType() &&
3293              Ctx.getIntWidth(T) == N;
3294     };
3295   };
3296 
3297   auto IsArray = [&Ctx](MatcherRef Elem, unsigned N) {
3298     return [&Ctx, Elem, N](QualType T) {
3299       const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(T);
3300       return CAT && CAT->getSize() == N && Elem(CAT->getElementType());
3301     };
3302   };
3303 
3304   auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3305     return [Fields](QualType T) {
3306       const RecordDecl *RD = T->getAsRecordDecl();
3307       if (!RD || RD->isUnion())
3308         return false;
3309       RD = RD->getDefinition();
3310       if (!RD)
3311         return false;
3312       if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3313         if (CXXRD->getNumBases())
3314           return false;
3315       auto MatcherIt = Fields.begin();
3316       for (const FieldDecl *FD : RD->fields()) {
3317         if (FD->isUnnamedBitfield()) continue;
3318         if (FD->isBitField() || MatcherIt == Fields.end() ||
3319             !(*MatcherIt)(FD->getType()))
3320           return false;
3321         ++MatcherIt;
3322       }
3323       return MatcherIt == Fields.end();
3324     };
3325   };
3326 
3327   // We expect an {i32, i16, i16, [8 x i8]}.
3328   return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3329 }
3330 
3331 APValue &MSGuidDecl::getAsAPValue() const {
3332   if (APVal.isAbsent() && isValidStructGUID(getASTContext(), getType())) {
3333     using llvm::APInt;
3334     using llvm::APSInt;
3335     APVal = APValue(APValue::UninitStruct(), 0, 4);
3336     APVal.getStructField(0) = APValue(APSInt(APInt(32, PartVal.Part1), true));
3337     APVal.getStructField(1) = APValue(APSInt(APInt(16, PartVal.Part2), true));
3338     APVal.getStructField(2) = APValue(APSInt(APInt(16, PartVal.Part3), true));
3339     APValue &Arr = APVal.getStructField(3) =
3340         APValue(APValue::UninitArray(), 8, 8);
3341     for (unsigned I = 0; I != 8; ++I) {
3342       Arr.getArrayInitializedElt(I) =
3343           APValue(APSInt(APInt(8, PartVal.Part4And5[I]), true));
3344     }
3345     // Register this APValue to be destroyed if necessary. (Note that the
3346     // MSGuidDecl destructor is never run.)
3347     getASTContext().addDestruction(&APVal);
3348   }
3349 
3350   return APVal;
3351 }
3352 
3353 static const char *getAccessName(AccessSpecifier AS) {
3354   switch (AS) {
3355     case AS_none:
3356       llvm_unreachable("Invalid access specifier!");
3357     case AS_public:
3358       return "public";
3359     case AS_private:
3360       return "private";
3361     case AS_protected:
3362       return "protected";
3363   }
3364   llvm_unreachable("Invalid access specifier!");
3365 }
3366 
3367 const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB,
3368                                              AccessSpecifier AS) {
3369   return DB << getAccessName(AS);
3370 }
3371