17330f729Sjoerg //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg // This file defines common functions that both ASTReader and ASTWriter use.
107330f729Sjoerg //
117330f729Sjoerg //===----------------------------------------------------------------------===//
127330f729Sjoerg
137330f729Sjoerg #include "ASTCommon.h"
147330f729Sjoerg #include "clang/AST/DeclCXX.h"
157330f729Sjoerg #include "clang/AST/DeclObjC.h"
167330f729Sjoerg #include "clang/Basic/IdentifierTable.h"
177330f729Sjoerg #include "clang/Serialization/ASTDeserializationListener.h"
187330f729Sjoerg #include "llvm/Support/DJB.h"
197330f729Sjoerg
207330f729Sjoerg using namespace clang;
217330f729Sjoerg
227330f729Sjoerg // Give ASTDeserializationListener's VTable a home.
~ASTDeserializationListener()237330f729Sjoerg ASTDeserializationListener::~ASTDeserializationListener() { }
247330f729Sjoerg
257330f729Sjoerg serialization::TypeIdx
TypeIdxFromBuiltin(const BuiltinType * BT)267330f729Sjoerg serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
277330f729Sjoerg unsigned ID = 0;
287330f729Sjoerg switch (BT->getKind()) {
297330f729Sjoerg case BuiltinType::Void:
307330f729Sjoerg ID = PREDEF_TYPE_VOID_ID;
317330f729Sjoerg break;
327330f729Sjoerg case BuiltinType::Bool:
337330f729Sjoerg ID = PREDEF_TYPE_BOOL_ID;
347330f729Sjoerg break;
357330f729Sjoerg case BuiltinType::Char_U:
367330f729Sjoerg ID = PREDEF_TYPE_CHAR_U_ID;
377330f729Sjoerg break;
387330f729Sjoerg case BuiltinType::UChar:
397330f729Sjoerg ID = PREDEF_TYPE_UCHAR_ID;
407330f729Sjoerg break;
417330f729Sjoerg case BuiltinType::UShort:
427330f729Sjoerg ID = PREDEF_TYPE_USHORT_ID;
437330f729Sjoerg break;
447330f729Sjoerg case BuiltinType::UInt:
457330f729Sjoerg ID = PREDEF_TYPE_UINT_ID;
467330f729Sjoerg break;
477330f729Sjoerg case BuiltinType::ULong:
487330f729Sjoerg ID = PREDEF_TYPE_ULONG_ID;
497330f729Sjoerg break;
507330f729Sjoerg case BuiltinType::ULongLong:
517330f729Sjoerg ID = PREDEF_TYPE_ULONGLONG_ID;
527330f729Sjoerg break;
537330f729Sjoerg case BuiltinType::UInt128:
547330f729Sjoerg ID = PREDEF_TYPE_UINT128_ID;
557330f729Sjoerg break;
567330f729Sjoerg case BuiltinType::Char_S:
577330f729Sjoerg ID = PREDEF_TYPE_CHAR_S_ID;
587330f729Sjoerg break;
597330f729Sjoerg case BuiltinType::SChar:
607330f729Sjoerg ID = PREDEF_TYPE_SCHAR_ID;
617330f729Sjoerg break;
627330f729Sjoerg case BuiltinType::WChar_S:
637330f729Sjoerg case BuiltinType::WChar_U:
647330f729Sjoerg ID = PREDEF_TYPE_WCHAR_ID;
657330f729Sjoerg break;
667330f729Sjoerg case BuiltinType::Short:
677330f729Sjoerg ID = PREDEF_TYPE_SHORT_ID;
687330f729Sjoerg break;
697330f729Sjoerg case BuiltinType::Int:
707330f729Sjoerg ID = PREDEF_TYPE_INT_ID;
717330f729Sjoerg break;
727330f729Sjoerg case BuiltinType::Long:
737330f729Sjoerg ID = PREDEF_TYPE_LONG_ID;
747330f729Sjoerg break;
757330f729Sjoerg case BuiltinType::LongLong:
767330f729Sjoerg ID = PREDEF_TYPE_LONGLONG_ID;
777330f729Sjoerg break;
787330f729Sjoerg case BuiltinType::Int128:
797330f729Sjoerg ID = PREDEF_TYPE_INT128_ID;
807330f729Sjoerg break;
817330f729Sjoerg case BuiltinType::Half:
827330f729Sjoerg ID = PREDEF_TYPE_HALF_ID;
837330f729Sjoerg break;
847330f729Sjoerg case BuiltinType::Float:
857330f729Sjoerg ID = PREDEF_TYPE_FLOAT_ID;
867330f729Sjoerg break;
877330f729Sjoerg case BuiltinType::Double:
887330f729Sjoerg ID = PREDEF_TYPE_DOUBLE_ID;
897330f729Sjoerg break;
907330f729Sjoerg case BuiltinType::LongDouble:
917330f729Sjoerg ID = PREDEF_TYPE_LONGDOUBLE_ID;
927330f729Sjoerg break;
937330f729Sjoerg case BuiltinType::ShortAccum:
947330f729Sjoerg ID = PREDEF_TYPE_SHORT_ACCUM_ID;
957330f729Sjoerg break;
967330f729Sjoerg case BuiltinType::Accum:
977330f729Sjoerg ID = PREDEF_TYPE_ACCUM_ID;
987330f729Sjoerg break;
997330f729Sjoerg case BuiltinType::LongAccum:
1007330f729Sjoerg ID = PREDEF_TYPE_LONG_ACCUM_ID;
1017330f729Sjoerg break;
1027330f729Sjoerg case BuiltinType::UShortAccum:
1037330f729Sjoerg ID = PREDEF_TYPE_USHORT_ACCUM_ID;
1047330f729Sjoerg break;
1057330f729Sjoerg case BuiltinType::UAccum:
1067330f729Sjoerg ID = PREDEF_TYPE_UACCUM_ID;
1077330f729Sjoerg break;
1087330f729Sjoerg case BuiltinType::ULongAccum:
1097330f729Sjoerg ID = PREDEF_TYPE_ULONG_ACCUM_ID;
1107330f729Sjoerg break;
1117330f729Sjoerg case BuiltinType::ShortFract:
1127330f729Sjoerg ID = PREDEF_TYPE_SHORT_FRACT_ID;
1137330f729Sjoerg break;
1147330f729Sjoerg case BuiltinType::Fract:
1157330f729Sjoerg ID = PREDEF_TYPE_FRACT_ID;
1167330f729Sjoerg break;
1177330f729Sjoerg case BuiltinType::LongFract:
1187330f729Sjoerg ID = PREDEF_TYPE_LONG_FRACT_ID;
1197330f729Sjoerg break;
1207330f729Sjoerg case BuiltinType::UShortFract:
1217330f729Sjoerg ID = PREDEF_TYPE_USHORT_FRACT_ID;
1227330f729Sjoerg break;
1237330f729Sjoerg case BuiltinType::UFract:
1247330f729Sjoerg ID = PREDEF_TYPE_UFRACT_ID;
1257330f729Sjoerg break;
1267330f729Sjoerg case BuiltinType::ULongFract:
1277330f729Sjoerg ID = PREDEF_TYPE_ULONG_FRACT_ID;
1287330f729Sjoerg break;
1297330f729Sjoerg case BuiltinType::SatShortAccum:
1307330f729Sjoerg ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;
1317330f729Sjoerg break;
1327330f729Sjoerg case BuiltinType::SatAccum:
1337330f729Sjoerg ID = PREDEF_TYPE_SAT_ACCUM_ID;
1347330f729Sjoerg break;
1357330f729Sjoerg case BuiltinType::SatLongAccum:
1367330f729Sjoerg ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;
1377330f729Sjoerg break;
1387330f729Sjoerg case BuiltinType::SatUShortAccum:
1397330f729Sjoerg ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;
1407330f729Sjoerg break;
1417330f729Sjoerg case BuiltinType::SatUAccum:
1427330f729Sjoerg ID = PREDEF_TYPE_SAT_UACCUM_ID;
1437330f729Sjoerg break;
1447330f729Sjoerg case BuiltinType::SatULongAccum:
1457330f729Sjoerg ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;
1467330f729Sjoerg break;
1477330f729Sjoerg case BuiltinType::SatShortFract:
1487330f729Sjoerg ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;
1497330f729Sjoerg break;
1507330f729Sjoerg case BuiltinType::SatFract:
1517330f729Sjoerg ID = PREDEF_TYPE_SAT_FRACT_ID;
1527330f729Sjoerg break;
1537330f729Sjoerg case BuiltinType::SatLongFract:
1547330f729Sjoerg ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;
1557330f729Sjoerg break;
1567330f729Sjoerg case BuiltinType::SatUShortFract:
1577330f729Sjoerg ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;
1587330f729Sjoerg break;
1597330f729Sjoerg case BuiltinType::SatUFract:
1607330f729Sjoerg ID = PREDEF_TYPE_SAT_UFRACT_ID;
1617330f729Sjoerg break;
1627330f729Sjoerg case BuiltinType::SatULongFract:
1637330f729Sjoerg ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;
1647330f729Sjoerg break;
1657330f729Sjoerg case BuiltinType::Float16:
1667330f729Sjoerg ID = PREDEF_TYPE_FLOAT16_ID;
1677330f729Sjoerg break;
1687330f729Sjoerg case BuiltinType::Float128:
1697330f729Sjoerg ID = PREDEF_TYPE_FLOAT128_ID;
1707330f729Sjoerg break;
1717330f729Sjoerg case BuiltinType::NullPtr:
1727330f729Sjoerg ID = PREDEF_TYPE_NULLPTR_ID;
1737330f729Sjoerg break;
1747330f729Sjoerg case BuiltinType::Char8:
1757330f729Sjoerg ID = PREDEF_TYPE_CHAR8_ID;
1767330f729Sjoerg break;
1777330f729Sjoerg case BuiltinType::Char16:
1787330f729Sjoerg ID = PREDEF_TYPE_CHAR16_ID;
1797330f729Sjoerg break;
1807330f729Sjoerg case BuiltinType::Char32:
1817330f729Sjoerg ID = PREDEF_TYPE_CHAR32_ID;
1827330f729Sjoerg break;
1837330f729Sjoerg case BuiltinType::Overload:
1847330f729Sjoerg ID = PREDEF_TYPE_OVERLOAD_ID;
1857330f729Sjoerg break;
1867330f729Sjoerg case BuiltinType::BoundMember:
1877330f729Sjoerg ID = PREDEF_TYPE_BOUND_MEMBER;
1887330f729Sjoerg break;
1897330f729Sjoerg case BuiltinType::PseudoObject:
1907330f729Sjoerg ID = PREDEF_TYPE_PSEUDO_OBJECT;
1917330f729Sjoerg break;
1927330f729Sjoerg case BuiltinType::Dependent:
1937330f729Sjoerg ID = PREDEF_TYPE_DEPENDENT_ID;
1947330f729Sjoerg break;
1957330f729Sjoerg case BuiltinType::UnknownAny:
1967330f729Sjoerg ID = PREDEF_TYPE_UNKNOWN_ANY;
1977330f729Sjoerg break;
1987330f729Sjoerg case BuiltinType::ARCUnbridgedCast:
1997330f729Sjoerg ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
2007330f729Sjoerg break;
2017330f729Sjoerg case BuiltinType::ObjCId:
2027330f729Sjoerg ID = PREDEF_TYPE_OBJC_ID;
2037330f729Sjoerg break;
2047330f729Sjoerg case BuiltinType::ObjCClass:
2057330f729Sjoerg ID = PREDEF_TYPE_OBJC_CLASS;
2067330f729Sjoerg break;
2077330f729Sjoerg case BuiltinType::ObjCSel:
2087330f729Sjoerg ID = PREDEF_TYPE_OBJC_SEL;
2097330f729Sjoerg break;
2107330f729Sjoerg #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2117330f729Sjoerg case BuiltinType::Id: \
2127330f729Sjoerg ID = PREDEF_TYPE_##Id##_ID; \
2137330f729Sjoerg break;
2147330f729Sjoerg #include "clang/Basic/OpenCLImageTypes.def"
2157330f729Sjoerg #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2167330f729Sjoerg case BuiltinType::Id: \
2177330f729Sjoerg ID = PREDEF_TYPE_##Id##_ID; \
2187330f729Sjoerg break;
2197330f729Sjoerg #include "clang/Basic/OpenCLExtensionTypes.def"
2207330f729Sjoerg case BuiltinType::OCLSampler:
2217330f729Sjoerg ID = PREDEF_TYPE_SAMPLER_ID;
2227330f729Sjoerg break;
2237330f729Sjoerg case BuiltinType::OCLEvent:
2247330f729Sjoerg ID = PREDEF_TYPE_EVENT_ID;
2257330f729Sjoerg break;
2267330f729Sjoerg case BuiltinType::OCLClkEvent:
2277330f729Sjoerg ID = PREDEF_TYPE_CLK_EVENT_ID;
2287330f729Sjoerg break;
2297330f729Sjoerg case BuiltinType::OCLQueue:
2307330f729Sjoerg ID = PREDEF_TYPE_QUEUE_ID;
2317330f729Sjoerg break;
2327330f729Sjoerg case BuiltinType::OCLReserveID:
2337330f729Sjoerg ID = PREDEF_TYPE_RESERVE_ID_ID;
2347330f729Sjoerg break;
2357330f729Sjoerg #define SVE_TYPE(Name, Id, SingletonId) \
2367330f729Sjoerg case BuiltinType::Id: \
2377330f729Sjoerg ID = PREDEF_TYPE_##Id##_ID; \
2387330f729Sjoerg break;
2397330f729Sjoerg #include "clang/Basic/AArch64SVEACLETypes.def"
240*e038c9c4Sjoerg #define PPC_VECTOR_TYPE(Name, Id, Size) \
241*e038c9c4Sjoerg case BuiltinType::Id: \
242*e038c9c4Sjoerg ID = PREDEF_TYPE_##Id##_ID; \
243*e038c9c4Sjoerg break;
244*e038c9c4Sjoerg #include "clang/Basic/PPCTypes.def"
245*e038c9c4Sjoerg #define RVV_TYPE(Name, Id, SingletonId) \
246*e038c9c4Sjoerg case BuiltinType::Id: \
247*e038c9c4Sjoerg ID = PREDEF_TYPE_##Id##_ID; \
248*e038c9c4Sjoerg break;
249*e038c9c4Sjoerg #include "clang/Basic/RISCVVTypes.def"
2507330f729Sjoerg case BuiltinType::BuiltinFn:
2517330f729Sjoerg ID = PREDEF_TYPE_BUILTIN_FN;
2527330f729Sjoerg break;
253*e038c9c4Sjoerg case BuiltinType::IncompleteMatrixIdx:
254*e038c9c4Sjoerg ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;
255*e038c9c4Sjoerg break;
2567330f729Sjoerg case BuiltinType::OMPArraySection:
2577330f729Sjoerg ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
2587330f729Sjoerg break;
259*e038c9c4Sjoerg case BuiltinType::OMPArrayShaping:
260*e038c9c4Sjoerg ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
261*e038c9c4Sjoerg break;
262*e038c9c4Sjoerg case BuiltinType::OMPIterator:
263*e038c9c4Sjoerg ID = PREDEF_TYPE_OMP_ITERATOR;
264*e038c9c4Sjoerg break;
265*e038c9c4Sjoerg case BuiltinType::BFloat16:
266*e038c9c4Sjoerg ID = PREDEF_TYPE_BFLOAT16_ID;
267*e038c9c4Sjoerg break;
2687330f729Sjoerg }
2697330f729Sjoerg
2707330f729Sjoerg return TypeIdx(ID);
2717330f729Sjoerg }
2727330f729Sjoerg
ComputeHash(Selector Sel)2737330f729Sjoerg unsigned serialization::ComputeHash(Selector Sel) {
2747330f729Sjoerg unsigned N = Sel.getNumArgs();
2757330f729Sjoerg if (N == 0)
2767330f729Sjoerg ++N;
2777330f729Sjoerg unsigned R = 5381;
2787330f729Sjoerg for (unsigned I = 0; I != N; ++I)
2797330f729Sjoerg if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
2807330f729Sjoerg R = llvm::djbHash(II->getName(), R);
2817330f729Sjoerg return R;
2827330f729Sjoerg }
2837330f729Sjoerg
2847330f729Sjoerg const DeclContext *
getDefinitiveDeclContext(const DeclContext * DC)2857330f729Sjoerg serialization::getDefinitiveDeclContext(const DeclContext *DC) {
2867330f729Sjoerg switch (DC->getDeclKind()) {
2877330f729Sjoerg // These entities may have multiple definitions.
2887330f729Sjoerg case Decl::TranslationUnit:
2897330f729Sjoerg case Decl::ExternCContext:
2907330f729Sjoerg case Decl::Namespace:
2917330f729Sjoerg case Decl::LinkageSpec:
2927330f729Sjoerg case Decl::Export:
2937330f729Sjoerg return nullptr;
2947330f729Sjoerg
2957330f729Sjoerg // C/C++ tag types can only be defined in one place.
2967330f729Sjoerg case Decl::Enum:
2977330f729Sjoerg case Decl::Record:
2987330f729Sjoerg if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
2997330f729Sjoerg return Def;
3007330f729Sjoerg return nullptr;
3017330f729Sjoerg
3027330f729Sjoerg // FIXME: These can be defined in one place... except special member
3037330f729Sjoerg // functions and out-of-line definitions.
3047330f729Sjoerg case Decl::CXXRecord:
3057330f729Sjoerg case Decl::ClassTemplateSpecialization:
3067330f729Sjoerg case Decl::ClassTemplatePartialSpecialization:
3077330f729Sjoerg return nullptr;
3087330f729Sjoerg
3097330f729Sjoerg // Each function, method, and block declaration is its own DeclContext.
3107330f729Sjoerg case Decl::Function:
3117330f729Sjoerg case Decl::CXXMethod:
3127330f729Sjoerg case Decl::CXXConstructor:
3137330f729Sjoerg case Decl::CXXDestructor:
3147330f729Sjoerg case Decl::CXXConversion:
3157330f729Sjoerg case Decl::ObjCMethod:
3167330f729Sjoerg case Decl::Block:
3177330f729Sjoerg case Decl::Captured:
3187330f729Sjoerg // Objective C categories, category implementations, and class
3197330f729Sjoerg // implementations can only be defined in one place.
3207330f729Sjoerg case Decl::ObjCCategory:
3217330f729Sjoerg case Decl::ObjCCategoryImpl:
3227330f729Sjoerg case Decl::ObjCImplementation:
3237330f729Sjoerg return DC;
3247330f729Sjoerg
3257330f729Sjoerg case Decl::ObjCProtocol:
3267330f729Sjoerg if (const ObjCProtocolDecl *Def
3277330f729Sjoerg = cast<ObjCProtocolDecl>(DC)->getDefinition())
3287330f729Sjoerg return Def;
3297330f729Sjoerg return nullptr;
3307330f729Sjoerg
3317330f729Sjoerg // FIXME: These are defined in one place, but properties in class extensions
3327330f729Sjoerg // end up being back-patched into the main interface. See
3337330f729Sjoerg // Sema::HandlePropertyInClassExtension for the offending code.
3347330f729Sjoerg case Decl::ObjCInterface:
3357330f729Sjoerg return nullptr;
3367330f729Sjoerg
3377330f729Sjoerg default:
3387330f729Sjoerg llvm_unreachable("Unhandled DeclContext in AST reader");
3397330f729Sjoerg }
3407330f729Sjoerg
3417330f729Sjoerg llvm_unreachable("Unhandled decl kind");
3427330f729Sjoerg }
3437330f729Sjoerg
isRedeclarableDeclKind(unsigned Kind)3447330f729Sjoerg bool serialization::isRedeclarableDeclKind(unsigned Kind) {
3457330f729Sjoerg switch (static_cast<Decl::Kind>(Kind)) {
3467330f729Sjoerg case Decl::TranslationUnit:
3477330f729Sjoerg case Decl::ExternCContext:
3487330f729Sjoerg // Special case of a "merged" declaration.
3497330f729Sjoerg return true;
3507330f729Sjoerg
3517330f729Sjoerg case Decl::Namespace:
3527330f729Sjoerg case Decl::NamespaceAlias:
3537330f729Sjoerg case Decl::Typedef:
3547330f729Sjoerg case Decl::TypeAlias:
3557330f729Sjoerg case Decl::Enum:
3567330f729Sjoerg case Decl::Record:
3577330f729Sjoerg case Decl::CXXRecord:
3587330f729Sjoerg case Decl::ClassTemplateSpecialization:
3597330f729Sjoerg case Decl::ClassTemplatePartialSpecialization:
3607330f729Sjoerg case Decl::VarTemplateSpecialization:
3617330f729Sjoerg case Decl::VarTemplatePartialSpecialization:
3627330f729Sjoerg case Decl::Function:
3637330f729Sjoerg case Decl::CXXDeductionGuide:
3647330f729Sjoerg case Decl::CXXMethod:
3657330f729Sjoerg case Decl::CXXConstructor:
3667330f729Sjoerg case Decl::CXXDestructor:
3677330f729Sjoerg case Decl::CXXConversion:
3687330f729Sjoerg case Decl::UsingShadow:
3697330f729Sjoerg case Decl::ConstructorUsingShadow:
3707330f729Sjoerg case Decl::Var:
3717330f729Sjoerg case Decl::FunctionTemplate:
3727330f729Sjoerg case Decl::ClassTemplate:
3737330f729Sjoerg case Decl::VarTemplate:
3747330f729Sjoerg case Decl::TypeAliasTemplate:
3757330f729Sjoerg case Decl::ObjCProtocol:
3767330f729Sjoerg case Decl::ObjCInterface:
3777330f729Sjoerg case Decl::Empty:
3787330f729Sjoerg return true;
3797330f729Sjoerg
3807330f729Sjoerg // Never redeclarable.
3817330f729Sjoerg case Decl::UsingDirective:
3827330f729Sjoerg case Decl::Label:
3837330f729Sjoerg case Decl::UnresolvedUsingTypename:
3847330f729Sjoerg case Decl::TemplateTypeParm:
3857330f729Sjoerg case Decl::EnumConstant:
3867330f729Sjoerg case Decl::UnresolvedUsingValue:
3877330f729Sjoerg case Decl::IndirectField:
3887330f729Sjoerg case Decl::Field:
3897330f729Sjoerg case Decl::MSProperty:
390*e038c9c4Sjoerg case Decl::MSGuid:
391*e038c9c4Sjoerg case Decl::TemplateParamObject:
3927330f729Sjoerg case Decl::ObjCIvar:
3937330f729Sjoerg case Decl::ObjCAtDefsField:
3947330f729Sjoerg case Decl::NonTypeTemplateParm:
3957330f729Sjoerg case Decl::TemplateTemplateParm:
3967330f729Sjoerg case Decl::Using:
3977330f729Sjoerg case Decl::UsingPack:
3987330f729Sjoerg case Decl::ObjCMethod:
3997330f729Sjoerg case Decl::ObjCCategory:
4007330f729Sjoerg case Decl::ObjCCategoryImpl:
4017330f729Sjoerg case Decl::ObjCImplementation:
4027330f729Sjoerg case Decl::ObjCProperty:
4037330f729Sjoerg case Decl::ObjCCompatibleAlias:
4047330f729Sjoerg case Decl::LinkageSpec:
4057330f729Sjoerg case Decl::Export:
4067330f729Sjoerg case Decl::ObjCPropertyImpl:
4077330f729Sjoerg case Decl::PragmaComment:
4087330f729Sjoerg case Decl::PragmaDetectMismatch:
4097330f729Sjoerg case Decl::FileScopeAsm:
4107330f729Sjoerg case Decl::AccessSpec:
4117330f729Sjoerg case Decl::Friend:
4127330f729Sjoerg case Decl::FriendTemplate:
4137330f729Sjoerg case Decl::StaticAssert:
4147330f729Sjoerg case Decl::Block:
4157330f729Sjoerg case Decl::Captured:
4167330f729Sjoerg case Decl::ClassScopeFunctionSpecialization:
4177330f729Sjoerg case Decl::Import:
4187330f729Sjoerg case Decl::OMPThreadPrivate:
4197330f729Sjoerg case Decl::OMPAllocate:
4207330f729Sjoerg case Decl::OMPRequires:
4217330f729Sjoerg case Decl::OMPCapturedExpr:
4227330f729Sjoerg case Decl::OMPDeclareReduction:
4237330f729Sjoerg case Decl::OMPDeclareMapper:
4247330f729Sjoerg case Decl::BuiltinTemplate:
4257330f729Sjoerg case Decl::Decomposition:
4267330f729Sjoerg case Decl::Binding:
4277330f729Sjoerg case Decl::Concept:
428*e038c9c4Sjoerg case Decl::LifetimeExtendedTemporary:
429*e038c9c4Sjoerg case Decl::RequiresExprBody:
4307330f729Sjoerg return false;
4317330f729Sjoerg
4327330f729Sjoerg // These indirectly derive from Redeclarable<T> but are not actually
4337330f729Sjoerg // redeclarable.
4347330f729Sjoerg case Decl::ImplicitParam:
4357330f729Sjoerg case Decl::ParmVar:
4367330f729Sjoerg case Decl::ObjCTypeParam:
4377330f729Sjoerg return false;
4387330f729Sjoerg }
4397330f729Sjoerg
4407330f729Sjoerg llvm_unreachable("Unhandled declaration kind");
4417330f729Sjoerg }
4427330f729Sjoerg
needsAnonymousDeclarationNumber(const NamedDecl * D)4437330f729Sjoerg bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
4447330f729Sjoerg // Friend declarations in dependent contexts aren't anonymous in the usual
4457330f729Sjoerg // sense, but they cannot be found by name lookup in their semantic context
4467330f729Sjoerg // (or indeed in any context), so we treat them as anonymous.
4477330f729Sjoerg //
4487330f729Sjoerg // This doesn't apply to friend tag decls; Sema makes those available to name
4497330f729Sjoerg // lookup in the surrounding context.
4507330f729Sjoerg if (D->getFriendObjectKind() &&
4517330f729Sjoerg D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
4527330f729Sjoerg // For function templates and class templates, the template is numbered and
4537330f729Sjoerg // not its pattern.
4547330f729Sjoerg if (auto *FD = dyn_cast<FunctionDecl>(D))
4557330f729Sjoerg return !FD->getDescribedFunctionTemplate();
4567330f729Sjoerg if (auto *RD = dyn_cast<CXXRecordDecl>(D))
4577330f729Sjoerg return !RD->getDescribedClassTemplate();
4587330f729Sjoerg return true;
4597330f729Sjoerg }
4607330f729Sjoerg
4617330f729Sjoerg // At block scope, we number everything that we need to deduplicate, since we
4627330f729Sjoerg // can't just use name matching to keep things lined up.
4637330f729Sjoerg // FIXME: This is only necessary for an inline function or a template or
4647330f729Sjoerg // similar.
4657330f729Sjoerg if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
4667330f729Sjoerg if (auto *VD = dyn_cast<VarDecl>(D))
4677330f729Sjoerg return VD->isStaticLocal();
4687330f729Sjoerg // FIXME: What about CapturedDecls (and declarations nested within them)?
4697330f729Sjoerg return isa<TagDecl>(D) || isa<BlockDecl>(D);
4707330f729Sjoerg }
4717330f729Sjoerg
4727330f729Sjoerg // Otherwise, we only care about anonymous class members / block-scope decls.
4737330f729Sjoerg // FIXME: We need to handle lambdas and blocks within inline / templated
4747330f729Sjoerg // variables too.
4757330f729Sjoerg if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext()))
4767330f729Sjoerg return false;
4777330f729Sjoerg return isa<TagDecl>(D) || isa<FieldDecl>(D);
4787330f729Sjoerg }
479