xref: /freebsd-src/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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 static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
1597   QualType T =
1598       cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1599           ->getConversionType();
1600   return Context.getCanonicalType(T);
1601 }
1602 
1603 /// Collect the visible conversions of a base class.
1604 ///
1605 /// \param Record a base class of the class we're considering
1606 /// \param InVirtual whether this base class is a virtual base (or a base
1607 ///   of a virtual base)
1608 /// \param Access the access along the inheritance path to this base
1609 /// \param ParentHiddenTypes the conversions provided by the inheritors
1610 ///   of this base
1611 /// \param Output the set to which to add conversions from non-virtual bases
1612 /// \param VOutput the set to which to add conversions from virtual bases
1613 /// \param HiddenVBaseCs the set of conversions which were hidden in a
1614 ///   virtual base along some inheritance path
1615 static void CollectVisibleConversions(
1616     ASTContext &Context, const CXXRecordDecl *Record, bool InVirtual,
1617     AccessSpecifier Access,
1618     const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1619     ASTUnresolvedSet &Output, UnresolvedSetImpl &VOutput,
1620     llvm::SmallPtrSet<NamedDecl *, 8> &HiddenVBaseCs) {
1621   // The set of types which have conversions in this class or its
1622   // subclasses.  As an optimization, we don't copy the derived set
1623   // unless it might change.
1624   const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1625   llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1626 
1627   // Collect the direct conversions and figure out which conversions
1628   // will be hidden in the subclasses.
1629   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1630   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1631   if (ConvI != ConvE) {
1632     HiddenTypesBuffer = ParentHiddenTypes;
1633     HiddenTypes = &HiddenTypesBuffer;
1634 
1635     for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
1636       CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1637       bool Hidden = ParentHiddenTypes.count(ConvType);
1638       if (!Hidden)
1639         HiddenTypesBuffer.insert(ConvType);
1640 
1641       // If this conversion is hidden and we're in a virtual base,
1642       // remember that it's hidden along some inheritance path.
1643       if (Hidden && InVirtual)
1644         HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1645 
1646       // If this conversion isn't hidden, add it to the appropriate output.
1647       else if (!Hidden) {
1648         AccessSpecifier IAccess
1649           = CXXRecordDecl::MergeAccess(Access, I.getAccess());
1650 
1651         if (InVirtual)
1652           VOutput.addDecl(I.getDecl(), IAccess);
1653         else
1654           Output.addDecl(Context, I.getDecl(), IAccess);
1655       }
1656     }
1657   }
1658 
1659   // Collect information recursively from any base classes.
1660   for (const auto &I : Record->bases()) {
1661     const auto *RT = I.getType()->getAs<RecordType>();
1662     if (!RT) continue;
1663 
1664     AccessSpecifier BaseAccess
1665       = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1666     bool BaseInVirtual = InVirtual || I.isVirtual();
1667 
1668     auto *Base = cast<CXXRecordDecl>(RT->getDecl());
1669     CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1670                               *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1671   }
1672 }
1673 
1674 /// Collect the visible conversions of a class.
1675 ///
1676 /// This would be extremely straightforward if it weren't for virtual
1677 /// bases.  It might be worth special-casing that, really.
1678 static void CollectVisibleConversions(ASTContext &Context,
1679                                       const CXXRecordDecl *Record,
1680                                       ASTUnresolvedSet &Output) {
1681   // The collection of all conversions in virtual bases that we've
1682   // found.  These will be added to the output as long as they don't
1683   // appear in the hidden-conversions set.
1684   UnresolvedSet<8> VBaseCs;
1685 
1686   // The set of conversions in virtual bases that we've determined to
1687   // be hidden.
1688   llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1689 
1690   // The set of types hidden by classes derived from this one.
1691   llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1692 
1693   // Go ahead and collect the direct conversions and add them to the
1694   // hidden-types set.
1695   CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1696   CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1697   Output.append(Context, ConvI, ConvE);
1698   for (; ConvI != ConvE; ++ConvI)
1699     HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
1700 
1701   // Recursively collect conversions from base classes.
1702   for (const auto &I : Record->bases()) {
1703     const auto *RT = I.getType()->getAs<RecordType>();
1704     if (!RT) continue;
1705 
1706     CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1707                               I.isVirtual(), I.getAccessSpecifier(),
1708                               HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1709   }
1710 
1711   // Add any unhidden conversions provided by virtual bases.
1712   for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1713          I != E; ++I) {
1714     if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1715       Output.addDecl(Context, I.getDecl(), I.getAccess());
1716   }
1717 }
1718 
1719 /// getVisibleConversionFunctions - get all conversion functions visible
1720 /// in current class; including conversion function templates.
1721 llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1722 CXXRecordDecl::getVisibleConversionFunctions() const {
1723   ASTContext &Ctx = getASTContext();
1724 
1725   ASTUnresolvedSet *Set;
1726   if (bases_begin() == bases_end()) {
1727     // If root class, all conversions are visible.
1728     Set = &data().Conversions.get(Ctx);
1729   } else {
1730     Set = &data().VisibleConversions.get(Ctx);
1731     // If visible conversion list is not evaluated, evaluate it.
1732     if (!data().ComputedVisibleConversions) {
1733       CollectVisibleConversions(Ctx, this, *Set);
1734       data().ComputedVisibleConversions = true;
1735     }
1736   }
1737   return llvm::make_range(Set->begin(), Set->end());
1738 }
1739 
1740 void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1741   // This operation is O(N) but extremely rare.  Sema only uses it to
1742   // remove UsingShadowDecls in a class that were followed by a direct
1743   // declaration, e.g.:
1744   //   class A : B {
1745   //     using B::operator int;
1746   //     operator int();
1747   //   };
1748   // This is uncommon by itself and even more uncommon in conjunction
1749   // with sufficiently large numbers of directly-declared conversions
1750   // that asymptotic behavior matters.
1751 
1752   ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
1753   for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1754     if (Convs[I].getDecl() == ConvDecl) {
1755       Convs.erase(I);
1756       assert(llvm::find(Convs, ConvDecl) == Convs.end() &&
1757              "conversion was found multiple times in unresolved set");
1758       return;
1759     }
1760   }
1761 
1762   llvm_unreachable("conversion not found in set!");
1763 }
1764 
1765 CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1766   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1767     return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1768 
1769   return nullptr;
1770 }
1771 
1772 MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1773   return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1774 }
1775 
1776 void
1777 CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1778                                              TemplateSpecializationKind TSK) {
1779   assert(TemplateOrInstantiation.isNull() &&
1780          "Previous template or instantiation?");
1781   assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
1782   TemplateOrInstantiation
1783     = new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1784 }
1785 
1786 ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1787   return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1788 }
1789 
1790 void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1791   TemplateOrInstantiation = Template;
1792 }
1793 
1794 TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1795   if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this))
1796     return Spec->getSpecializationKind();
1797 
1798   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1799     return MSInfo->getTemplateSpecializationKind();
1800 
1801   return TSK_Undeclared;
1802 }
1803 
1804 void
1805 CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1806   if (auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1807     Spec->setSpecializationKind(TSK);
1808     return;
1809   }
1810 
1811   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1812     MSInfo->setTemplateSpecializationKind(TSK);
1813     return;
1814   }
1815 
1816   llvm_unreachable("Not a class template or member class specialization");
1817 }
1818 
1819 const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
1820   auto GetDefinitionOrSelf =
1821       [](const CXXRecordDecl *D) -> const CXXRecordDecl * {
1822     if (auto *Def = D->getDefinition())
1823       return Def;
1824     return D;
1825   };
1826 
1827   // If it's a class template specialization, find the template or partial
1828   // specialization from which it was instantiated.
1829   if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1830     auto From = TD->getInstantiatedFrom();
1831     if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1832       while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1833         if (NewCTD->isMemberSpecialization())
1834           break;
1835         CTD = NewCTD;
1836       }
1837       return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1838     }
1839     if (auto *CTPSD =
1840             From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1841       while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1842         if (NewCTPSD->isMemberSpecialization())
1843           break;
1844         CTPSD = NewCTPSD;
1845       }
1846       return GetDefinitionOrSelf(CTPSD);
1847     }
1848   }
1849 
1850   if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1851     if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
1852       const CXXRecordDecl *RD = this;
1853       while (auto *NewRD = RD->getInstantiatedFromMemberClass())
1854         RD = NewRD;
1855       return GetDefinitionOrSelf(RD);
1856     }
1857   }
1858 
1859   assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
1860          "couldn't find pattern for class template instantiation");
1861   return nullptr;
1862 }
1863 
1864 CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
1865   ASTContext &Context = getASTContext();
1866   QualType ClassType = Context.getTypeDeclType(this);
1867 
1868   DeclarationName Name
1869     = Context.DeclarationNames.getCXXDestructorName(
1870                                           Context.getCanonicalType(ClassType));
1871 
1872   DeclContext::lookup_result R = lookup(Name);
1873 
1874   return R.empty() ? nullptr : dyn_cast<CXXDestructorDecl>(R.front());
1875 }
1876 
1877 bool CXXRecordDecl::isAnyDestructorNoReturn() const {
1878   // Destructor is noreturn.
1879   if (const CXXDestructorDecl *Destructor = getDestructor())
1880     if (Destructor->isNoReturn())
1881       return true;
1882 
1883   // Check base classes destructor for noreturn.
1884   for (const auto &Base : bases())
1885     if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl())
1886       if (RD->isAnyDestructorNoReturn())
1887         return true;
1888 
1889   // Check fields for noreturn.
1890   for (const auto *Field : fields())
1891     if (const CXXRecordDecl *RD =
1892             Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1893       if (RD->isAnyDestructorNoReturn())
1894         return true;
1895 
1896   // All destructors are not noreturn.
1897   return false;
1898 }
1899 
1900 static bool isDeclContextInNamespace(const DeclContext *DC) {
1901   while (!DC->isTranslationUnit()) {
1902     if (DC->isNamespace())
1903       return true;
1904     DC = DC->getParent();
1905   }
1906   return false;
1907 }
1908 
1909 bool CXXRecordDecl::isInterfaceLike() const {
1910   assert(hasDefinition() && "checking for interface-like without a definition");
1911   // All __interfaces are inheritently interface-like.
1912   if (isInterface())
1913     return true;
1914 
1915   // Interface-like types cannot have a user declared constructor, destructor,
1916   // friends, VBases, conversion functions, or fields.  Additionally, lambdas
1917   // cannot be interface types.
1918   if (isLambda() || hasUserDeclaredConstructor() ||
1919       hasUserDeclaredDestructor() || !field_empty() || hasFriends() ||
1920       getNumVBases() > 0 || conversion_end() - conversion_begin() > 0)
1921     return false;
1922 
1923   // No interface-like type can have a method with a definition.
1924   for (const auto *const Method : methods())
1925     if (Method->isDefined() && !Method->isImplicit())
1926       return false;
1927 
1928   // Check "Special" types.
1929   const auto *Uuid = getAttr<UuidAttr>();
1930   // MS SDK declares IUnknown/IDispatch both in the root of a TU, or in an
1931   // extern C++ block directly in the TU.  These are only valid if in one
1932   // of these two situations.
1933   if (Uuid && isStruct() && !getDeclContext()->isExternCContext() &&
1934       !isDeclContextInNamespace(getDeclContext()) &&
1935       ((getName() == "IUnknown" &&
1936         Uuid->getGuid() == "00000000-0000-0000-C000-000000000046") ||
1937        (getName() == "IDispatch" &&
1938         Uuid->getGuid() == "00020400-0000-0000-C000-000000000046"))) {
1939     if (getNumBases() > 0)
1940       return false;
1941     return true;
1942   }
1943 
1944   // FIXME: Any access specifiers is supposed to make this no longer interface
1945   // like.
1946 
1947   // If this isn't a 'special' type, it must have a single interface-like base.
1948   if (getNumBases() != 1)
1949     return false;
1950 
1951   const auto BaseSpec = *bases_begin();
1952   if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() != AS_public)
1953     return false;
1954   const auto *Base = BaseSpec.getType()->getAsCXXRecordDecl();
1955   if (Base->isInterface() || !Base->isInterfaceLike())
1956     return false;
1957   return true;
1958 }
1959 
1960 void CXXRecordDecl::completeDefinition() {
1961   completeDefinition(nullptr);
1962 }
1963 
1964 void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
1965   RecordDecl::completeDefinition();
1966 
1967   // If the class may be abstract (but hasn't been marked as such), check for
1968   // any pure final overriders.
1969   if (mayBeAbstract()) {
1970     CXXFinalOverriderMap MyFinalOverriders;
1971     if (!FinalOverriders) {
1972       getFinalOverriders(MyFinalOverriders);
1973       FinalOverriders = &MyFinalOverriders;
1974     }
1975 
1976     bool Done = false;
1977     for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1978                                      MEnd = FinalOverriders->end();
1979          M != MEnd && !Done; ++M) {
1980       for (OverridingMethods::iterator SO = M->second.begin(),
1981                                     SOEnd = M->second.end();
1982            SO != SOEnd && !Done; ++SO) {
1983         assert(SO->second.size() > 0 &&
1984                "All virtual functions have overriding virtual functions");
1985 
1986         // C++ [class.abstract]p4:
1987         //   A class is abstract if it contains or inherits at least one
1988         //   pure virtual function for which the final overrider is pure
1989         //   virtual.
1990         if (SO->second.front().Method->isPure()) {
1991           data().Abstract = true;
1992           Done = true;
1993           break;
1994         }
1995       }
1996     }
1997   }
1998 
1999   // Set access bits correctly on the directly-declared conversions.
2000   for (conversion_iterator I = conversion_begin(), E = conversion_end();
2001        I != E; ++I)
2002     I.setAccess((*I)->getAccess());
2003 }
2004 
2005 bool CXXRecordDecl::mayBeAbstract() const {
2006   if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
2007       isDependentContext())
2008     return false;
2009 
2010   for (const auto &B : bases()) {
2011     const auto *BaseDecl =
2012         cast<CXXRecordDecl>(B.getType()->castAs<RecordType>()->getDecl());
2013     if (BaseDecl->isAbstract())
2014       return true;
2015   }
2016 
2017   return false;
2018 }
2019 
2020 bool CXXRecordDecl::isEffectivelyFinal() const {
2021   auto *Def = getDefinition();
2022   if (!Def)
2023     return false;
2024   if (Def->hasAttr<FinalAttr>())
2025     return true;
2026   if (const auto *Dtor = Def->getDestructor())
2027     if (Dtor->hasAttr<FinalAttr>())
2028       return true;
2029   return false;
2030 }
2031 
2032 void CXXDeductionGuideDecl::anchor() {}
2033 
2034 bool ExplicitSpecifier::isEquivalent(const ExplicitSpecifier Other) const {
2035   if ((getKind() != Other.getKind() ||
2036        getKind() == ExplicitSpecKind::Unresolved)) {
2037     if (getKind() == ExplicitSpecKind::Unresolved &&
2038         Other.getKind() == ExplicitSpecKind::Unresolved) {
2039       ODRHash SelfHash, OtherHash;
2040       SelfHash.AddStmt(getExpr());
2041       OtherHash.AddStmt(Other.getExpr());
2042       return SelfHash.CalculateHash() == OtherHash.CalculateHash();
2043     } else
2044       return false;
2045   }
2046   return true;
2047 }
2048 
2049 ExplicitSpecifier ExplicitSpecifier::getFromDecl(FunctionDecl *Function) {
2050   switch (Function->getDeclKind()) {
2051   case Decl::Kind::CXXConstructor:
2052     return cast<CXXConstructorDecl>(Function)->getExplicitSpecifier();
2053   case Decl::Kind::CXXConversion:
2054     return cast<CXXConversionDecl>(Function)->getExplicitSpecifier();
2055   case Decl::Kind::CXXDeductionGuide:
2056     return cast<CXXDeductionGuideDecl>(Function)->getExplicitSpecifier();
2057   default:
2058     return {};
2059   }
2060 }
2061 
2062 CXXDeductionGuideDecl *CXXDeductionGuideDecl::Create(
2063     ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2064     ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T,
2065     TypeSourceInfo *TInfo, SourceLocation EndLocation) {
2066   return new (C, DC) CXXDeductionGuideDecl(C, DC, StartLoc, ES, NameInfo, T,
2067                                            TInfo, EndLocation);
2068 }
2069 
2070 CXXDeductionGuideDecl *CXXDeductionGuideDecl::CreateDeserialized(ASTContext &C,
2071                                                                  unsigned ID) {
2072   return new (C, ID) CXXDeductionGuideDecl(
2073       C, nullptr, SourceLocation(), ExplicitSpecifier(), DeclarationNameInfo(),
2074       QualType(), nullptr, SourceLocation());
2075 }
2076 
2077 RequiresExprBodyDecl *RequiresExprBodyDecl::Create(
2078     ASTContext &C, DeclContext *DC, SourceLocation StartLoc) {
2079   return new (C, DC) RequiresExprBodyDecl(C, DC, StartLoc);
2080 }
2081 
2082 RequiresExprBodyDecl *RequiresExprBodyDecl::CreateDeserialized(ASTContext &C,
2083                                                                unsigned ID) {
2084   return new (C, ID) RequiresExprBodyDecl(C, nullptr, SourceLocation());
2085 }
2086 
2087 void CXXMethodDecl::anchor() {}
2088 
2089 bool CXXMethodDecl::isStatic() const {
2090   const CXXMethodDecl *MD = getCanonicalDecl();
2091 
2092   if (MD->getStorageClass() == SC_Static)
2093     return true;
2094 
2095   OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
2096   return isStaticOverloadedOperator(OOK);
2097 }
2098 
2099 static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
2100                                  const CXXMethodDecl *BaseMD) {
2101   for (const CXXMethodDecl *MD : DerivedMD->overridden_methods()) {
2102     if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
2103       return true;
2104     if (recursivelyOverrides(MD, BaseMD))
2105       return true;
2106   }
2107   return false;
2108 }
2109 
2110 CXXMethodDecl *
2111 CXXMethodDecl::getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD,
2112                                                      bool MayBeBase) {
2113   if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
2114     return this;
2115 
2116   // Lookup doesn't work for destructors, so handle them separately.
2117   if (isa<CXXDestructorDecl>(this)) {
2118     CXXMethodDecl *MD = RD->getDestructor();
2119     if (MD) {
2120       if (recursivelyOverrides(MD, this))
2121         return MD;
2122       if (MayBeBase && recursivelyOverrides(this, MD))
2123         return MD;
2124     }
2125     return nullptr;
2126   }
2127 
2128   for (auto *ND : RD->lookup(getDeclName())) {
2129     auto *MD = dyn_cast<CXXMethodDecl>(ND);
2130     if (!MD)
2131       continue;
2132     if (recursivelyOverrides(MD, this))
2133       return MD;
2134     if (MayBeBase && recursivelyOverrides(this, MD))
2135       return MD;
2136   }
2137 
2138   return nullptr;
2139 }
2140 
2141 CXXMethodDecl *
2142 CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
2143                                              bool MayBeBase) {
2144   if (auto *MD = getCorrespondingMethodDeclaredInClass(RD, MayBeBase))
2145     return MD;
2146 
2147   llvm::SmallVector<CXXMethodDecl*, 4> FinalOverriders;
2148   auto AddFinalOverrider = [&](CXXMethodDecl *D) {
2149     // If this function is overridden by a candidate final overrider, it is not
2150     // a final overrider.
2151     for (CXXMethodDecl *OtherD : FinalOverriders) {
2152       if (declaresSameEntity(D, OtherD) || recursivelyOverrides(OtherD, D))
2153         return;
2154     }
2155 
2156     // Other candidate final overriders might be overridden by this function.
2157     FinalOverriders.erase(
2158         std::remove_if(FinalOverriders.begin(), FinalOverriders.end(),
2159                        [&](CXXMethodDecl *OtherD) {
2160                          return recursivelyOverrides(D, OtherD);
2161                        }),
2162         FinalOverriders.end());
2163 
2164     FinalOverriders.push_back(D);
2165   };
2166 
2167   for (const auto &I : RD->bases()) {
2168     const RecordType *RT = I.getType()->getAs<RecordType>();
2169     if (!RT)
2170       continue;
2171     const auto *Base = cast<CXXRecordDecl>(RT->getDecl());
2172     if (CXXMethodDecl *D = this->getCorrespondingMethodInClass(Base))
2173       AddFinalOverrider(D);
2174   }
2175 
2176   return FinalOverriders.size() == 1 ? FinalOverriders.front() : nullptr;
2177 }
2178 
2179 CXXMethodDecl *CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
2180                                      SourceLocation StartLoc,
2181                                      const DeclarationNameInfo &NameInfo,
2182                                      QualType T, TypeSourceInfo *TInfo,
2183                                      StorageClass SC, bool isInline,
2184                                      ConstexprSpecKind ConstexprKind,
2185                                      SourceLocation EndLocation,
2186                                      Expr *TrailingRequiresClause) {
2187   return new (C, RD)
2188       CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo, T, TInfo, SC,
2189                     isInline, ConstexprKind, EndLocation,
2190                     TrailingRequiresClause);
2191 }
2192 
2193 CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2194   return new (C, ID)
2195       CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(),
2196                     DeclarationNameInfo(), QualType(), nullptr, SC_None, false,
2197                     ConstexprSpecKind::Unspecified, SourceLocation(), nullptr);
2198 }
2199 
2200 CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
2201                                                      bool IsAppleKext) {
2202   assert(isVirtual() && "this method is expected to be virtual");
2203 
2204   // When building with -fapple-kext, all calls must go through the vtable since
2205   // the kernel linker can do runtime patching of vtables.
2206   if (IsAppleKext)
2207     return nullptr;
2208 
2209   // If the member function is marked 'final', we know that it can't be
2210   // overridden and can therefore devirtualize it unless it's pure virtual.
2211   if (hasAttr<FinalAttr>())
2212     return isPure() ? nullptr : this;
2213 
2214   // If Base is unknown, we cannot devirtualize.
2215   if (!Base)
2216     return nullptr;
2217 
2218   // If the base expression (after skipping derived-to-base conversions) is a
2219   // class prvalue, then we can devirtualize.
2220   Base = Base->getBestDynamicClassTypeExpr();
2221   if (Base->isRValue() && Base->getType()->isRecordType())
2222     return this;
2223 
2224   // If we don't even know what we would call, we can't devirtualize.
2225   const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
2226   if (!BestDynamicDecl)
2227     return nullptr;
2228 
2229   // There may be a method corresponding to MD in a derived class.
2230   CXXMethodDecl *DevirtualizedMethod =
2231       getCorrespondingMethodInClass(BestDynamicDecl);
2232 
2233   // If there final overrider in the dynamic type is ambiguous, we can't
2234   // devirtualize this call.
2235   if (!DevirtualizedMethod)
2236     return nullptr;
2237 
2238   // If that method is pure virtual, we can't devirtualize. If this code is
2239   // reached, the result would be UB, not a direct call to the derived class
2240   // function, and we can't assume the derived class function is defined.
2241   if (DevirtualizedMethod->isPure())
2242     return nullptr;
2243 
2244   // If that method is marked final, we can devirtualize it.
2245   if (DevirtualizedMethod->hasAttr<FinalAttr>())
2246     return DevirtualizedMethod;
2247 
2248   // Similarly, if the class itself or its destructor is marked 'final',
2249   // the class can't be derived from and we can therefore devirtualize the
2250   // member function call.
2251   if (BestDynamicDecl->isEffectivelyFinal())
2252     return DevirtualizedMethod;
2253 
2254   if (const auto *DRE = dyn_cast<DeclRefExpr>(Base)) {
2255     if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2256       if (VD->getType()->isRecordType())
2257         // This is a record decl. We know the type and can devirtualize it.
2258         return DevirtualizedMethod;
2259 
2260     return nullptr;
2261   }
2262 
2263   // We can devirtualize calls on an object accessed by a class member access
2264   // expression, since by C++11 [basic.life]p6 we know that it can't refer to
2265   // a derived class object constructed in the same location.
2266   if (const auto *ME = dyn_cast<MemberExpr>(Base)) {
2267     const ValueDecl *VD = ME->getMemberDecl();
2268     return VD->getType()->isRecordType() ? DevirtualizedMethod : nullptr;
2269   }
2270 
2271   // Likewise for calls on an object accessed by a (non-reference) pointer to
2272   // member access.
2273   if (auto *BO = dyn_cast<BinaryOperator>(Base)) {
2274     if (BO->isPtrMemOp()) {
2275       auto *MPT = BO->getRHS()->getType()->castAs<MemberPointerType>();
2276       if (MPT->getPointeeType()->isRecordType())
2277         return DevirtualizedMethod;
2278     }
2279   }
2280 
2281   // We can't devirtualize the call.
2282   return nullptr;
2283 }
2284 
2285 bool CXXMethodDecl::isUsualDeallocationFunction(
2286     SmallVectorImpl<const FunctionDecl *> &PreventedBy) const {
2287   assert(PreventedBy.empty() && "PreventedBy is expected to be empty");
2288   if (getOverloadedOperator() != OO_Delete &&
2289       getOverloadedOperator() != OO_Array_Delete)
2290     return false;
2291 
2292   // C++ [basic.stc.dynamic.deallocation]p2:
2293   //   A template instance is never a usual deallocation function,
2294   //   regardless of its signature.
2295   if (getPrimaryTemplate())
2296     return false;
2297 
2298   // C++ [basic.stc.dynamic.deallocation]p2:
2299   //   If a class T has a member deallocation function named operator delete
2300   //   with exactly one parameter, then that function is a usual (non-placement)
2301   //   deallocation function. [...]
2302   if (getNumParams() == 1)
2303     return true;
2304   unsigned UsualParams = 1;
2305 
2306   // C++ P0722:
2307   //   A destroying operator delete is a usual deallocation function if
2308   //   removing the std::destroying_delete_t parameter and changing the
2309   //   first parameter type from T* to void* results in the signature of
2310   //   a usual deallocation function.
2311   if (isDestroyingOperatorDelete())
2312     ++UsualParams;
2313 
2314   // C++ <=14 [basic.stc.dynamic.deallocation]p2:
2315   //   [...] If class T does not declare such an operator delete but does
2316   //   declare a member deallocation function named operator delete with
2317   //   exactly two parameters, the second of which has type std::size_t (18.1),
2318   //   then this function is a usual deallocation function.
2319   //
2320   // C++17 says a usual deallocation function is one with the signature
2321   //   (void* [, size_t] [, std::align_val_t] [, ...])
2322   // and all such functions are usual deallocation functions. It's not clear
2323   // that allowing varargs functions was intentional.
2324   ASTContext &Context = getASTContext();
2325   if (UsualParams < getNumParams() &&
2326       Context.hasSameUnqualifiedType(getParamDecl(UsualParams)->getType(),
2327                                      Context.getSizeType()))
2328     ++UsualParams;
2329 
2330   if (UsualParams < getNumParams() &&
2331       getParamDecl(UsualParams)->getType()->isAlignValT())
2332     ++UsualParams;
2333 
2334   if (UsualParams != getNumParams())
2335     return false;
2336 
2337   // In C++17 onwards, all potential usual deallocation functions are actual
2338   // usual deallocation functions. Honor this behavior when post-C++14
2339   // deallocation functions are offered as extensions too.
2340   // FIXME(EricWF): Destrying Delete should be a language option. How do we
2341   // handle when destroying delete is used prior to C++17?
2342   if (Context.getLangOpts().CPlusPlus17 ||
2343       Context.getLangOpts().AlignedAllocation ||
2344       isDestroyingOperatorDelete())
2345     return true;
2346 
2347   // This function is a usual deallocation function if there are no
2348   // single-parameter deallocation functions of the same kind.
2349   DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
2350   bool Result = true;
2351   for (const auto *D : R) {
2352     if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2353       if (FD->getNumParams() == 1) {
2354         PreventedBy.push_back(FD);
2355         Result = false;
2356       }
2357     }
2358   }
2359   return Result;
2360 }
2361 
2362 bool CXXMethodDecl::isCopyAssignmentOperator() const {
2363   // C++0x [class.copy]p17:
2364   //  A user-declared copy assignment operator X::operator= is a non-static
2365   //  non-template member function of class X with exactly one parameter of
2366   //  type X, X&, const X&, volatile X& or const volatile X&.
2367   if (/*operator=*/getOverloadedOperator() != OO_Equal ||
2368       /*non-static*/ isStatic() ||
2369       /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2370       getNumParams() != 1)
2371     return false;
2372 
2373   QualType ParamType = getParamDecl(0)->getType();
2374   if (const auto *Ref = ParamType->getAs<LValueReferenceType>())
2375     ParamType = Ref->getPointeeType();
2376 
2377   ASTContext &Context = getASTContext();
2378   QualType ClassType
2379     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2380   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2381 }
2382 
2383 bool CXXMethodDecl::isMoveAssignmentOperator() const {
2384   // C++0x [class.copy]p19:
2385   //  A user-declared move assignment operator X::operator= is a non-static
2386   //  non-template member function of class X with exactly one parameter of type
2387   //  X&&, const X&&, volatile X&&, or const volatile X&&.
2388   if (getOverloadedOperator() != OO_Equal || isStatic() ||
2389       getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2390       getNumParams() != 1)
2391     return false;
2392 
2393   QualType ParamType = getParamDecl(0)->getType();
2394   if (!isa<RValueReferenceType>(ParamType))
2395     return false;
2396   ParamType = ParamType->getPointeeType();
2397 
2398   ASTContext &Context = getASTContext();
2399   QualType ClassType
2400     = Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2401   return Context.hasSameUnqualifiedType(ClassType, ParamType);
2402 }
2403 
2404 void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
2405   assert(MD->isCanonicalDecl() && "Method is not canonical!");
2406   assert(!MD->getParent()->isDependentContext() &&
2407          "Can't add an overridden method to a class template!");
2408   assert(MD->isVirtual() && "Method is not virtual!");
2409 
2410   getASTContext().addOverriddenMethod(this, MD);
2411 }
2412 
2413 CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
2414   if (isa<CXXConstructorDecl>(this)) return nullptr;
2415   return getASTContext().overridden_methods_begin(this);
2416 }
2417 
2418 CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
2419   if (isa<CXXConstructorDecl>(this)) return nullptr;
2420   return getASTContext().overridden_methods_end(this);
2421 }
2422 
2423 unsigned CXXMethodDecl::size_overridden_methods() const {
2424   if (isa<CXXConstructorDecl>(this)) return 0;
2425   return getASTContext().overridden_methods_size(this);
2426 }
2427 
2428 CXXMethodDecl::overridden_method_range
2429 CXXMethodDecl::overridden_methods() const {
2430   if (isa<CXXConstructorDecl>(this))
2431     return overridden_method_range(nullptr, nullptr);
2432   return getASTContext().overridden_methods(this);
2433 }
2434 
2435 static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT,
2436                                   const CXXRecordDecl *Decl) {
2437   QualType ClassTy = C.getTypeDeclType(Decl);
2438   return C.getQualifiedType(ClassTy, FPT->getMethodQuals());
2439 }
2440 
2441 QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT,
2442                                     const CXXRecordDecl *Decl) {
2443   ASTContext &C = Decl->getASTContext();
2444   QualType ObjectTy = ::getThisObjectType(C, FPT, Decl);
2445   return C.getPointerType(ObjectTy);
2446 }
2447 
2448 QualType CXXMethodDecl::getThisObjectType(const FunctionProtoType *FPT,
2449                                           const CXXRecordDecl *Decl) {
2450   ASTContext &C = Decl->getASTContext();
2451   return ::getThisObjectType(C, FPT, Decl);
2452 }
2453 
2454 QualType CXXMethodDecl::getThisType() const {
2455   // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
2456   // If the member function is declared const, the type of this is const X*,
2457   // if the member function is declared volatile, the type of this is
2458   // volatile X*, and if the member function is declared const volatile,
2459   // the type of this is const volatile X*.
2460   assert(isInstance() && "No 'this' for static methods!");
2461   return CXXMethodDecl::getThisType(getType()->castAs<FunctionProtoType>(),
2462                                     getParent());
2463 }
2464 
2465 QualType CXXMethodDecl::getThisObjectType() const {
2466   // Ditto getThisType.
2467   assert(isInstance() && "No 'this' for static methods!");
2468   return CXXMethodDecl::getThisObjectType(
2469       getType()->castAs<FunctionProtoType>(), getParent());
2470 }
2471 
2472 bool CXXMethodDecl::hasInlineBody() const {
2473   // If this function is a template instantiation, look at the template from
2474   // which it was instantiated.
2475   const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
2476   if (!CheckFn)
2477     CheckFn = this;
2478 
2479   const FunctionDecl *fn;
2480   return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
2481          (fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
2482 }
2483 
2484 bool CXXMethodDecl::isLambdaStaticInvoker() const {
2485   const CXXRecordDecl *P = getParent();
2486   return P->isLambda() && getDeclName().isIdentifier() &&
2487          getName() == getLambdaStaticInvokerName();
2488 }
2489 
2490 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2491                                        TypeSourceInfo *TInfo, bool IsVirtual,
2492                                        SourceLocation L, Expr *Init,
2493                                        SourceLocation R,
2494                                        SourceLocation EllipsisLoc)
2495     : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
2496       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
2497       IsWritten(false), SourceOrder(0) {}
2498 
2499 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2500                                        FieldDecl *Member,
2501                                        SourceLocation MemberLoc,
2502                                        SourceLocation L, Expr *Init,
2503                                        SourceLocation R)
2504     : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
2505       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2506       IsWritten(false), SourceOrder(0) {}
2507 
2508 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2509                                        IndirectFieldDecl *Member,
2510                                        SourceLocation MemberLoc,
2511                                        SourceLocation L, Expr *Init,
2512                                        SourceLocation R)
2513     : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
2514       LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2515       IsWritten(false), SourceOrder(0) {}
2516 
2517 CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2518                                        TypeSourceInfo *TInfo,
2519                                        SourceLocation L, Expr *Init,
2520                                        SourceLocation R)
2521     : Initializee(TInfo), Init(Init), LParenLoc(L), RParenLoc(R),
2522       IsDelegating(true), IsVirtual(false), IsWritten(false), SourceOrder(0) {}
2523 
2524 int64_t CXXCtorInitializer::getID(const ASTContext &Context) const {
2525   return Context.getAllocator()
2526                 .identifyKnownAlignedObject<CXXCtorInitializer>(this);
2527 }
2528 
2529 TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
2530   if (isBaseInitializer())
2531     return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
2532   else
2533     return {};
2534 }
2535 
2536 const Type *CXXCtorInitializer::getBaseClass() const {
2537   if (isBaseInitializer())
2538     return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
2539   else
2540     return nullptr;
2541 }
2542 
2543 SourceLocation CXXCtorInitializer::getSourceLocation() const {
2544   if (isInClassMemberInitializer())
2545     return getAnyMember()->getLocation();
2546 
2547   if (isAnyMemberInitializer())
2548     return getMemberLocation();
2549 
2550   if (const auto *TSInfo = Initializee.get<TypeSourceInfo *>())
2551     return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
2552 
2553   return {};
2554 }
2555 
2556 SourceRange CXXCtorInitializer::getSourceRange() const {
2557   if (isInClassMemberInitializer()) {
2558     FieldDecl *D = getAnyMember();
2559     if (Expr *I = D->getInClassInitializer())
2560       return I->getSourceRange();
2561     return {};
2562   }
2563 
2564   return SourceRange(getSourceLocation(), getRParenLoc());
2565 }
2566 
2567 CXXConstructorDecl::CXXConstructorDecl(
2568     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2569     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2570     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2571     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2572     Expr *TrailingRequiresClause)
2573     : CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2574                     SC_None, isInline, ConstexprKind, SourceLocation(),
2575                     TrailingRequiresClause) {
2576   setNumCtorInitializers(0);
2577   setInheritingConstructor(static_cast<bool>(Inherited));
2578   setImplicit(isImplicitlyDeclared);
2579   CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.getExpr() ? 1 : 0;
2580   if (Inherited)
2581     *getTrailingObjects<InheritedConstructor>() = Inherited;
2582   setExplicitSpecifier(ES);
2583 }
2584 
2585 void CXXConstructorDecl::anchor() {}
2586 
2587 CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
2588                                                            unsigned ID,
2589                                                            uint64_t AllocKind) {
2590   bool hasTraillingExplicit = static_cast<bool>(AllocKind & TAKHasTailExplicit);
2591   bool isInheritingConstructor =
2592       static_cast<bool>(AllocKind & TAKInheritsConstructor);
2593   unsigned Extra =
2594       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2595           isInheritingConstructor, hasTraillingExplicit);
2596   auto *Result = new (C, ID, Extra) CXXConstructorDecl(
2597       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2598       ExplicitSpecifier(), false, false, ConstexprSpecKind::Unspecified,
2599       InheritedConstructor(), nullptr);
2600   Result->setInheritingConstructor(isInheritingConstructor);
2601   Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2602       hasTraillingExplicit;
2603   Result->setExplicitSpecifier(ExplicitSpecifier());
2604   return Result;
2605 }
2606 
2607 CXXConstructorDecl *CXXConstructorDecl::Create(
2608     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2609     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2610     ExplicitSpecifier ES, bool isInline, bool isImplicitlyDeclared,
2611     ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited,
2612     Expr *TrailingRequiresClause) {
2613   assert(NameInfo.getName().getNameKind()
2614          == DeclarationName::CXXConstructorName &&
2615          "Name must refer to a constructor");
2616   unsigned Extra =
2617       additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2618           Inherited ? 1 : 0, ES.getExpr() ? 1 : 0);
2619   return new (C, RD, Extra)
2620       CXXConstructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, ES, isInline,
2621                          isImplicitlyDeclared, ConstexprKind, Inherited,
2622                          TrailingRequiresClause);
2623 }
2624 
2625 CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
2626   return CtorInitializers.get(getASTContext().getExternalSource());
2627 }
2628 
2629 CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
2630   assert(isDelegatingConstructor() && "Not a delegating constructor!");
2631   Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
2632   if (const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2633     return Construct->getConstructor();
2634 
2635   return nullptr;
2636 }
2637 
2638 bool CXXConstructorDecl::isDefaultConstructor() const {
2639   // C++ [class.default.ctor]p1:
2640   //   A default constructor for a class X is a constructor of class X for
2641   //   which each parameter that is not a function parameter pack has a default
2642   //   argument (including the case of a constructor with no parameters)
2643   return getMinRequiredArguments() == 0;
2644 }
2645 
2646 bool
2647 CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
2648   return isCopyOrMoveConstructor(TypeQuals) &&
2649          getParamDecl(0)->getType()->isLValueReferenceType();
2650 }
2651 
2652 bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
2653   return isCopyOrMoveConstructor(TypeQuals) &&
2654          getParamDecl(0)->getType()->isRValueReferenceType();
2655 }
2656 
2657 /// Determine whether this is a copy or move constructor.
2658 bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
2659   // C++ [class.copy]p2:
2660   //   A non-template constructor for class X is a copy constructor
2661   //   if its first parameter is of type X&, const X&, volatile X& or
2662   //   const volatile X&, and either there are no other parameters
2663   //   or else all other parameters have default arguments (8.3.6).
2664   // C++0x [class.copy]p3:
2665   //   A non-template constructor for class X is a move constructor if its
2666   //   first parameter is of type X&&, const X&&, volatile X&&, or
2667   //   const volatile X&&, and either there are no other parameters or else
2668   //   all other parameters have default arguments.
2669   if (!hasOneParamOrDefaultArgs() || getPrimaryTemplate() != nullptr ||
2670       getDescribedFunctionTemplate() != nullptr)
2671     return false;
2672 
2673   const ParmVarDecl *Param = getParamDecl(0);
2674 
2675   // Do we have a reference type?
2676   const auto *ParamRefType = Param->getType()->getAs<ReferenceType>();
2677   if (!ParamRefType)
2678     return false;
2679 
2680   // Is it a reference to our class type?
2681   ASTContext &Context = getASTContext();
2682 
2683   CanQualType PointeeType
2684     = Context.getCanonicalType(ParamRefType->getPointeeType());
2685   CanQualType ClassTy
2686     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2687   if (PointeeType.getUnqualifiedType() != ClassTy)
2688     return false;
2689 
2690   // FIXME: other qualifiers?
2691 
2692   // We have a copy or move constructor.
2693   TypeQuals = PointeeType.getCVRQualifiers();
2694   return true;
2695 }
2696 
2697 bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
2698   // C++ [class.conv.ctor]p1:
2699   //   A constructor declared without the function-specifier explicit
2700   //   that can be called with a single parameter specifies a
2701   //   conversion from the type of its first parameter to the type of
2702   //   its class. Such a constructor is called a converting
2703   //   constructor.
2704   if (isExplicit() && !AllowExplicit)
2705     return false;
2706 
2707   // FIXME: This has nothing to do with the definition of converting
2708   // constructor, but is convenient for how we use this function in overload
2709   // resolution.
2710   return getNumParams() == 0
2711              ? getType()->castAs<FunctionProtoType>()->isVariadic()
2712              : getMinRequiredArguments() <= 1;
2713 }
2714 
2715 bool CXXConstructorDecl::isSpecializationCopyingObject() const {
2716   if (!hasOneParamOrDefaultArgs() || getDescribedFunctionTemplate() != nullptr)
2717     return false;
2718 
2719   const ParmVarDecl *Param = getParamDecl(0);
2720 
2721   ASTContext &Context = getASTContext();
2722   CanQualType ParamType = Context.getCanonicalType(Param->getType());
2723 
2724   // Is it the same as our class type?
2725   CanQualType ClassTy
2726     = Context.getCanonicalType(Context.getTagDeclType(getParent()));
2727   if (ParamType.getUnqualifiedType() != ClassTy)
2728     return false;
2729 
2730   return true;
2731 }
2732 
2733 void CXXDestructorDecl::anchor() {}
2734 
2735 CXXDestructorDecl *
2736 CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2737   return new (C, ID) CXXDestructorDecl(
2738       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2739       false, false, ConstexprSpecKind::Unspecified, nullptr);
2740 }
2741 
2742 CXXDestructorDecl *CXXDestructorDecl::Create(
2743     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2744     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2745     bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2746     Expr *TrailingRequiresClause) {
2747   assert(NameInfo.getName().getNameKind()
2748          == DeclarationName::CXXDestructorName &&
2749          "Name must refer to a destructor");
2750   return new (C, RD)
2751       CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline,
2752                         isImplicitlyDeclared, ConstexprKind,
2753                         TrailingRequiresClause);
2754 }
2755 
2756 void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
2757   auto *First = cast<CXXDestructorDecl>(getFirstDecl());
2758   if (OD && !First->OperatorDelete) {
2759     First->OperatorDelete = OD;
2760     First->OperatorDeleteThisArg = ThisArg;
2761     if (auto *L = getASTMutationListener())
2762       L->ResolvedOperatorDelete(First, OD, ThisArg);
2763   }
2764 }
2765 
2766 void CXXConversionDecl::anchor() {}
2767 
2768 CXXConversionDecl *
2769 CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2770   return new (C, ID) CXXConversionDecl(
2771       C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2772       false, ExplicitSpecifier(), ConstexprSpecKind::Unspecified,
2773       SourceLocation(), nullptr);
2774 }
2775 
2776 CXXConversionDecl *CXXConversionDecl::Create(
2777     ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2778     const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2779     bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind,
2780     SourceLocation EndLocation, Expr *TrailingRequiresClause) {
2781   assert(NameInfo.getName().getNameKind()
2782          == DeclarationName::CXXConversionFunctionName &&
2783          "Name must refer to a conversion function");
2784   return new (C, RD)
2785       CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo, isInline, ES,
2786                         ConstexprKind, EndLocation, TrailingRequiresClause);
2787 }
2788 
2789 bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2790   return isImplicit() && getParent()->isLambda() &&
2791          getConversionType()->isBlockPointerType();
2792 }
2793 
2794 LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
2795                                  SourceLocation LangLoc, LanguageIDs lang,
2796                                  bool HasBraces)
2797     : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
2798       ExternLoc(ExternLoc), RBraceLoc(SourceLocation()) {
2799   setLanguage(lang);
2800   LinkageSpecDeclBits.HasBraces = HasBraces;
2801 }
2802 
2803 void LinkageSpecDecl::anchor() {}
2804 
2805 LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
2806                                          DeclContext *DC,
2807                                          SourceLocation ExternLoc,
2808                                          SourceLocation LangLoc,
2809                                          LanguageIDs Lang,
2810                                          bool HasBraces) {
2811   return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2812 }
2813 
2814 LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2815                                                      unsigned ID) {
2816   return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(),
2817                                      SourceLocation(), lang_c, false);
2818 }
2819 
2820 void UsingDirectiveDecl::anchor() {}
2821 
2822 UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2823                                                SourceLocation L,
2824                                                SourceLocation NamespaceLoc,
2825                                            NestedNameSpecifierLoc QualifierLoc,
2826                                                SourceLocation IdentLoc,
2827                                                NamedDecl *Used,
2828                                                DeclContext *CommonAncestor) {
2829   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2830     Used = NS->getOriginalNamespace();
2831   return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2832                                         IdentLoc, Used, CommonAncestor);
2833 }
2834 
2835 UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2836                                                            unsigned ID) {
2837   return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2838                                         SourceLocation(),
2839                                         NestedNameSpecifierLoc(),
2840                                         SourceLocation(), nullptr, nullptr);
2841 }
2842 
2843 NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2844   if (auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2845     return NA->getNamespace();
2846   return cast_or_null<NamespaceDecl>(NominatedNamespace);
2847 }
2848 
2849 NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
2850                              SourceLocation StartLoc, SourceLocation IdLoc,
2851                              IdentifierInfo *Id, NamespaceDecl *PrevDecl)
2852     : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
2853       redeclarable_base(C), LocStart(StartLoc),
2854       AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2855   setPreviousDecl(PrevDecl);
2856 
2857   if (PrevDecl)
2858     AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace());
2859 }
2860 
2861 NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2862                                      bool Inline, SourceLocation StartLoc,
2863                                      SourceLocation IdLoc, IdentifierInfo *Id,
2864                                      NamespaceDecl *PrevDecl) {
2865   return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id,
2866                                    PrevDecl);
2867 }
2868 
2869 NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2870   return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
2871                                    SourceLocation(), nullptr, nullptr);
2872 }
2873 
2874 NamespaceDecl *NamespaceDecl::getOriginalNamespace() {
2875   if (isFirstDecl())
2876     return this;
2877 
2878   return AnonOrFirstNamespaceAndInline.getPointer();
2879 }
2880 
2881 const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const {
2882   if (isFirstDecl())
2883     return this;
2884 
2885   return AnonOrFirstNamespaceAndInline.getPointer();
2886 }
2887 
2888 bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); }
2889 
2890 NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
2891   return getNextRedeclaration();
2892 }
2893 
2894 NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
2895   return getPreviousDecl();
2896 }
2897 
2898 NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
2899   return getMostRecentDecl();
2900 }
2901 
2902 void NamespaceAliasDecl::anchor() {}
2903 
2904 NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
2905   return getNextRedeclaration();
2906 }
2907 
2908 NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
2909   return getPreviousDecl();
2910 }
2911 
2912 NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
2913   return getMostRecentDecl();
2914 }
2915 
2916 NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
2917                                                SourceLocation UsingLoc,
2918                                                SourceLocation AliasLoc,
2919                                                IdentifierInfo *Alias,
2920                                            NestedNameSpecifierLoc QualifierLoc,
2921                                                SourceLocation IdentLoc,
2922                                                NamedDecl *Namespace) {
2923   // FIXME: Preserve the aliased namespace as written.
2924   if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2925     Namespace = NS->getOriginalNamespace();
2926   return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
2927                                         QualifierLoc, IdentLoc, Namespace);
2928 }
2929 
2930 NamespaceAliasDecl *
2931 NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2932   return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
2933                                         SourceLocation(), nullptr,
2934                                         NestedNameSpecifierLoc(),
2935                                         SourceLocation(), nullptr);
2936 }
2937 
2938 void LifetimeExtendedTemporaryDecl::anchor() {}
2939 
2940 /// Retrieve the storage duration for the materialized temporary.
2941 StorageDuration LifetimeExtendedTemporaryDecl::getStorageDuration() const {
2942   const ValueDecl *ExtendingDecl = getExtendingDecl();
2943   if (!ExtendingDecl)
2944     return SD_FullExpression;
2945   // FIXME: This is not necessarily correct for a temporary materialized
2946   // within a default initializer.
2947   if (isa<FieldDecl>(ExtendingDecl))
2948     return SD_Automatic;
2949   // FIXME: This only works because storage class specifiers are not allowed
2950   // on decomposition declarations.
2951   if (isa<BindingDecl>(ExtendingDecl))
2952     return ExtendingDecl->getDeclContext()->isFunctionOrMethod() ? SD_Automatic
2953                                                                  : SD_Static;
2954   return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
2955 }
2956 
2957 APValue *LifetimeExtendedTemporaryDecl::getOrCreateValue(bool MayCreate) const {
2958   assert(getStorageDuration() == SD_Static &&
2959          "don't need to cache the computed value for this temporary");
2960   if (MayCreate && !Value) {
2961     Value = (new (getASTContext()) APValue);
2962     getASTContext().addDestruction(Value);
2963   }
2964   assert(Value && "may not be null");
2965   return Value;
2966 }
2967 
2968 void UsingShadowDecl::anchor() {}
2969 
2970 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
2971                                  SourceLocation Loc, UsingDecl *Using,
2972                                  NamedDecl *Target)
2973     : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()),
2974       redeclarable_base(C), UsingOrNextShadow(cast<NamedDecl>(Using)) {
2975   if (Target)
2976     setTargetDecl(Target);
2977   setImplicit();
2978 }
2979 
2980 UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
2981     : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
2982       redeclarable_base(C) {}
2983 
2984 UsingShadowDecl *
2985 UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
2986   return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
2987 }
2988 
2989 UsingDecl *UsingShadowDecl::getUsingDecl() const {
2990   const UsingShadowDecl *Shadow = this;
2991   while (const auto *NextShadow =
2992              dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
2993     Shadow = NextShadow;
2994   return cast<UsingDecl>(Shadow->UsingOrNextShadow);
2995 }
2996 
2997 void ConstructorUsingShadowDecl::anchor() {}
2998 
2999 ConstructorUsingShadowDecl *
3000 ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
3001                                    SourceLocation Loc, UsingDecl *Using,
3002                                    NamedDecl *Target, bool IsVirtual) {
3003   return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
3004                                                 IsVirtual);
3005 }
3006 
3007 ConstructorUsingShadowDecl *
3008 ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3009   return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
3010 }
3011 
3012 CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
3013   return getUsingDecl()->getQualifier()->getAsRecordDecl();
3014 }
3015 
3016 void UsingDecl::anchor() {}
3017 
3018 void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
3019   assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
3020          "declaration already in set");
3021   assert(S->getUsingDecl() == this);
3022 
3023   if (FirstUsingShadow.getPointer())
3024     S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3025   FirstUsingShadow.setPointer(S);
3026 }
3027 
3028 void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
3029   assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() &&
3030          "declaration not in set");
3031   assert(S->getUsingDecl() == this);
3032 
3033   // Remove S from the shadow decl chain. This is O(n) but hopefully rare.
3034 
3035   if (FirstUsingShadow.getPointer() == S) {
3036     FirstUsingShadow.setPointer(
3037       dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3038     S->UsingOrNextShadow = this;
3039     return;
3040   }
3041 
3042   UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
3043   while (Prev->UsingOrNextShadow != S)
3044     Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3045   Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3046   S->UsingOrNextShadow = this;
3047 }
3048 
3049 UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
3050                              NestedNameSpecifierLoc QualifierLoc,
3051                              const DeclarationNameInfo &NameInfo,
3052                              bool HasTypename) {
3053   return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3054 }
3055 
3056 UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3057   return new (C, ID) UsingDecl(nullptr, SourceLocation(),
3058                                NestedNameSpecifierLoc(), DeclarationNameInfo(),
3059                                false);
3060 }
3061 
3062 SourceRange UsingDecl::getSourceRange() const {
3063   SourceLocation Begin = isAccessDeclaration()
3064     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3065   return SourceRange(Begin, getNameInfo().getEndLoc());
3066 }
3067 
3068 void UsingPackDecl::anchor() {}
3069 
3070 UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
3071                                      NamedDecl *InstantiatedFrom,
3072                                      ArrayRef<NamedDecl *> UsingDecls) {
3073   size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3074   return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3075 }
3076 
3077 UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, unsigned ID,
3078                                                  unsigned NumExpansions) {
3079   size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3080   auto *Result = new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, None);
3081   Result->NumExpansions = NumExpansions;
3082   auto *Trail = Result->getTrailingObjects<NamedDecl *>();
3083   for (unsigned I = 0; I != NumExpansions; ++I)
3084     new (Trail + I) NamedDecl*(nullptr);
3085   return Result;
3086 }
3087 
3088 void UnresolvedUsingValueDecl::anchor() {}
3089 
3090 UnresolvedUsingValueDecl *
3091 UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
3092                                  SourceLocation UsingLoc,
3093                                  NestedNameSpecifierLoc QualifierLoc,
3094                                  const DeclarationNameInfo &NameInfo,
3095                                  SourceLocation EllipsisLoc) {
3096   return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
3097                                               QualifierLoc, NameInfo,
3098                                               EllipsisLoc);
3099 }
3100 
3101 UnresolvedUsingValueDecl *
3102 UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3103   return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
3104                                               SourceLocation(),
3105                                               NestedNameSpecifierLoc(),
3106                                               DeclarationNameInfo(),
3107                                               SourceLocation());
3108 }
3109 
3110 SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
3111   SourceLocation Begin = isAccessDeclaration()
3112     ? getQualifierLoc().getBeginLoc() : UsingLocation;
3113   return SourceRange(Begin, getNameInfo().getEndLoc());
3114 }
3115 
3116 void UnresolvedUsingTypenameDecl::anchor() {}
3117 
3118 UnresolvedUsingTypenameDecl *
3119 UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
3120                                     SourceLocation UsingLoc,
3121                                     SourceLocation TypenameLoc,
3122                                     NestedNameSpecifierLoc QualifierLoc,
3123                                     SourceLocation TargetNameLoc,
3124                                     DeclarationName TargetName,
3125                                     SourceLocation EllipsisLoc) {
3126   return new (C, DC) UnresolvedUsingTypenameDecl(
3127       DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3128       TargetName.getAsIdentifierInfo(), EllipsisLoc);
3129 }
3130 
3131 UnresolvedUsingTypenameDecl *
3132 UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3133   return new (C, ID) UnresolvedUsingTypenameDecl(
3134       nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
3135       SourceLocation(), nullptr, SourceLocation());
3136 }
3137 
3138 void StaticAssertDecl::anchor() {}
3139 
3140 StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
3141                                            SourceLocation StaticAssertLoc,
3142                                            Expr *AssertExpr,
3143                                            StringLiteral *Message,
3144                                            SourceLocation RParenLoc,
3145                                            bool Failed) {
3146   return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
3147                                       RParenLoc, Failed);
3148 }
3149 
3150 StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
3151                                                        unsigned ID) {
3152   return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
3153                                       nullptr, SourceLocation(), false);
3154 }
3155 
3156 void BindingDecl::anchor() {}
3157 
3158 BindingDecl *BindingDecl::Create(ASTContext &C, DeclContext *DC,
3159                                  SourceLocation IdLoc, IdentifierInfo *Id) {
3160   return new (C, DC) BindingDecl(DC, IdLoc, Id);
3161 }
3162 
3163 BindingDecl *BindingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3164   return new (C, ID) BindingDecl(nullptr, SourceLocation(), nullptr);
3165 }
3166 
3167 ValueDecl *BindingDecl::getDecomposedDecl() const {
3168   ExternalASTSource *Source =
3169       Decomp.isOffset() ? getASTContext().getExternalSource() : nullptr;
3170   return cast_or_null<ValueDecl>(Decomp.get(Source));
3171 }
3172 
3173 VarDecl *BindingDecl::getHoldingVar() const {
3174   Expr *B = getBinding();
3175   if (!B)
3176     return nullptr;
3177   auto *DRE = dyn_cast<DeclRefExpr>(B->IgnoreImplicit());
3178   if (!DRE)
3179     return nullptr;
3180 
3181   auto *VD = cast<VarDecl>(DRE->getDecl());
3182   assert(VD->isImplicit() && "holding var for binding decl not implicit");
3183   return VD;
3184 }
3185 
3186 void DecompositionDecl::anchor() {}
3187 
3188 DecompositionDecl *DecompositionDecl::Create(ASTContext &C, DeclContext *DC,
3189                                              SourceLocation StartLoc,
3190                                              SourceLocation LSquareLoc,
3191                                              QualType T, TypeSourceInfo *TInfo,
3192                                              StorageClass SC,
3193                                              ArrayRef<BindingDecl *> Bindings) {
3194   size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
3195   return new (C, DC, Extra)
3196       DecompositionDecl(C, DC, StartLoc, LSquareLoc, T, TInfo, SC, Bindings);
3197 }
3198 
3199 DecompositionDecl *DecompositionDecl::CreateDeserialized(ASTContext &C,
3200                                                          unsigned ID,
3201                                                          unsigned NumBindings) {
3202   size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3203   auto *Result = new (C, ID, Extra)
3204       DecompositionDecl(C, nullptr, SourceLocation(), SourceLocation(),
3205                         QualType(), nullptr, StorageClass(), None);
3206   // Set up and clean out the bindings array.
3207   Result->NumBindings = NumBindings;
3208   auto *Trail = Result->getTrailingObjects<BindingDecl *>();
3209   for (unsigned I = 0; I != NumBindings; ++I)
3210     new (Trail + I) BindingDecl*(nullptr);
3211   return Result;
3212 }
3213 
3214 void DecompositionDecl::printName(llvm::raw_ostream &os) const {
3215   os << '[';
3216   bool Comma = false;
3217   for (const auto *B : bindings()) {
3218     if (Comma)
3219       os << ", ";
3220     B->printName(os);
3221     Comma = true;
3222   }
3223   os << ']';
3224 }
3225 
3226 void MSPropertyDecl::anchor() {}
3227 
3228 MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
3229                                        SourceLocation L, DeclarationName N,
3230                                        QualType T, TypeSourceInfo *TInfo,
3231                                        SourceLocation StartL,
3232                                        IdentifierInfo *Getter,
3233                                        IdentifierInfo *Setter) {
3234   return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3235 }
3236 
3237 MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
3238                                                    unsigned ID) {
3239   return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
3240                                     DeclarationName(), QualType(), nullptr,
3241                                     SourceLocation(), nullptr, nullptr);
3242 }
3243 
3244 void MSGuidDecl::anchor() {}
3245 
3246 MSGuidDecl::MSGuidDecl(DeclContext *DC, QualType T, Parts P)
3247     : ValueDecl(Decl::MSGuid, DC, SourceLocation(), DeclarationName(), T),
3248       PartVal(P), APVal() {}
3249 
3250 MSGuidDecl *MSGuidDecl::Create(const ASTContext &C, QualType T, Parts P) {
3251   DeclContext *DC = C.getTranslationUnitDecl();
3252   return new (C, DC) MSGuidDecl(DC, T, P);
3253 }
3254 
3255 MSGuidDecl *MSGuidDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
3256   return new (C, ID) MSGuidDecl(nullptr, QualType(), Parts());
3257 }
3258 
3259 void MSGuidDecl::printName(llvm::raw_ostream &OS) const {
3260   OS << llvm::format("GUID{%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-",
3261                      PartVal.Part1, PartVal.Part2, PartVal.Part3);
3262   unsigned I = 0;
3263   for (uint8_t Byte : PartVal.Part4And5) {
3264     OS << llvm::format("%02" PRIx8, Byte);
3265     if (++I == 2)
3266       OS << '-';
3267   }
3268   OS << '}';
3269 }
3270 
3271 /// Determine if T is a valid 'struct _GUID' of the shape that we expect.
3272 static bool isValidStructGUID(ASTContext &Ctx, QualType T) {
3273   // FIXME: We only need to check this once, not once each time we compute a
3274   // GUID APValue.
3275   using MatcherRef = llvm::function_ref<bool(QualType)>;
3276 
3277   auto IsInt = [&Ctx](unsigned N) {
3278     return [&Ctx, N](QualType T) {
3279       return T->isUnsignedIntegerOrEnumerationType() &&
3280              Ctx.getIntWidth(T) == N;
3281     };
3282   };
3283 
3284   auto IsArray = [&Ctx](MatcherRef Elem, unsigned N) {
3285     return [&Ctx, Elem, N](QualType T) {
3286       const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(T);
3287       return CAT && CAT->getSize() == N && Elem(CAT->getElementType());
3288     };
3289   };
3290 
3291   auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3292     return [Fields](QualType T) {
3293       const RecordDecl *RD = T->getAsRecordDecl();
3294       if (!RD || RD->isUnion())
3295         return false;
3296       RD = RD->getDefinition();
3297       if (!RD)
3298         return false;
3299       if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3300         if (CXXRD->getNumBases())
3301           return false;
3302       auto MatcherIt = Fields.begin();
3303       for (const FieldDecl *FD : RD->fields()) {
3304         if (FD->isUnnamedBitfield()) continue;
3305         if (FD->isBitField() || MatcherIt == Fields.end() ||
3306             !(*MatcherIt)(FD->getType()))
3307           return false;
3308         ++MatcherIt;
3309       }
3310       return MatcherIt == Fields.end();
3311     };
3312   };
3313 
3314   // We expect an {i32, i16, i16, [8 x i8]}.
3315   return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3316 }
3317 
3318 APValue &MSGuidDecl::getAsAPValue() const {
3319   if (APVal.isAbsent() && isValidStructGUID(getASTContext(), getType())) {
3320     using llvm::APInt;
3321     using llvm::APSInt;
3322     APVal = APValue(APValue::UninitStruct(), 0, 4);
3323     APVal.getStructField(0) = APValue(APSInt(APInt(32, PartVal.Part1), true));
3324     APVal.getStructField(1) = APValue(APSInt(APInt(16, PartVal.Part2), true));
3325     APVal.getStructField(2) = APValue(APSInt(APInt(16, PartVal.Part3), true));
3326     APValue &Arr = APVal.getStructField(3) =
3327         APValue(APValue::UninitArray(), 8, 8);
3328     for (unsigned I = 0; I != 8; ++I) {
3329       Arr.getArrayInitializedElt(I) =
3330           APValue(APSInt(APInt(8, PartVal.Part4And5[I]), true));
3331     }
3332     // Register this APValue to be destroyed if necessary. (Note that the
3333     // MSGuidDecl destructor is never run.)
3334     getASTContext().addDestruction(&APVal);
3335   }
3336 
3337   return APVal;
3338 }
3339 
3340 static const char *getAccessName(AccessSpecifier AS) {
3341   switch (AS) {
3342     case AS_none:
3343       llvm_unreachable("Invalid access specifier!");
3344     case AS_public:
3345       return "public";
3346     case AS_private:
3347       return "private";
3348     case AS_protected:
3349       return "protected";
3350   }
3351   llvm_unreachable("Invalid access specifier!");
3352 }
3353 
3354 const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB,
3355                                              AccessSpecifier AS) {
3356   return DB << getAccessName(AS);
3357 }
3358