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