1e5dd7070Spatrick //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This file defines common functions that both ASTReader and ASTWriter use.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick
13e5dd7070Spatrick #include "ASTCommon.h"
14e5dd7070Spatrick #include "clang/AST/DeclCXX.h"
15e5dd7070Spatrick #include "clang/AST/DeclObjC.h"
16e5dd7070Spatrick #include "clang/Basic/IdentifierTable.h"
17e5dd7070Spatrick #include "clang/Serialization/ASTDeserializationListener.h"
18e5dd7070Spatrick #include "llvm/Support/DJB.h"
19e5dd7070Spatrick
20e5dd7070Spatrick using namespace clang;
21e5dd7070Spatrick
22e5dd7070Spatrick // Give ASTDeserializationListener's VTable a home.
~ASTDeserializationListener()23e5dd7070Spatrick ASTDeserializationListener::~ASTDeserializationListener() { }
24e5dd7070Spatrick
25e5dd7070Spatrick serialization::TypeIdx
TypeIdxFromBuiltin(const BuiltinType * BT)26e5dd7070Spatrick serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
27e5dd7070Spatrick unsigned ID = 0;
28e5dd7070Spatrick switch (BT->getKind()) {
29e5dd7070Spatrick case BuiltinType::Void:
30e5dd7070Spatrick ID = PREDEF_TYPE_VOID_ID;
31e5dd7070Spatrick break;
32e5dd7070Spatrick case BuiltinType::Bool:
33e5dd7070Spatrick ID = PREDEF_TYPE_BOOL_ID;
34e5dd7070Spatrick break;
35e5dd7070Spatrick case BuiltinType::Char_U:
36e5dd7070Spatrick ID = PREDEF_TYPE_CHAR_U_ID;
37e5dd7070Spatrick break;
38e5dd7070Spatrick case BuiltinType::UChar:
39e5dd7070Spatrick ID = PREDEF_TYPE_UCHAR_ID;
40e5dd7070Spatrick break;
41e5dd7070Spatrick case BuiltinType::UShort:
42e5dd7070Spatrick ID = PREDEF_TYPE_USHORT_ID;
43e5dd7070Spatrick break;
44e5dd7070Spatrick case BuiltinType::UInt:
45e5dd7070Spatrick ID = PREDEF_TYPE_UINT_ID;
46e5dd7070Spatrick break;
47e5dd7070Spatrick case BuiltinType::ULong:
48e5dd7070Spatrick ID = PREDEF_TYPE_ULONG_ID;
49e5dd7070Spatrick break;
50e5dd7070Spatrick case BuiltinType::ULongLong:
51e5dd7070Spatrick ID = PREDEF_TYPE_ULONGLONG_ID;
52e5dd7070Spatrick break;
53e5dd7070Spatrick case BuiltinType::UInt128:
54e5dd7070Spatrick ID = PREDEF_TYPE_UINT128_ID;
55e5dd7070Spatrick break;
56e5dd7070Spatrick case BuiltinType::Char_S:
57e5dd7070Spatrick ID = PREDEF_TYPE_CHAR_S_ID;
58e5dd7070Spatrick break;
59e5dd7070Spatrick case BuiltinType::SChar:
60e5dd7070Spatrick ID = PREDEF_TYPE_SCHAR_ID;
61e5dd7070Spatrick break;
62e5dd7070Spatrick case BuiltinType::WChar_S:
63e5dd7070Spatrick case BuiltinType::WChar_U:
64e5dd7070Spatrick ID = PREDEF_TYPE_WCHAR_ID;
65e5dd7070Spatrick break;
66e5dd7070Spatrick case BuiltinType::Short:
67e5dd7070Spatrick ID = PREDEF_TYPE_SHORT_ID;
68e5dd7070Spatrick break;
69e5dd7070Spatrick case BuiltinType::Int:
70e5dd7070Spatrick ID = PREDEF_TYPE_INT_ID;
71e5dd7070Spatrick break;
72e5dd7070Spatrick case BuiltinType::Long:
73e5dd7070Spatrick ID = PREDEF_TYPE_LONG_ID;
74e5dd7070Spatrick break;
75e5dd7070Spatrick case BuiltinType::LongLong:
76e5dd7070Spatrick ID = PREDEF_TYPE_LONGLONG_ID;
77e5dd7070Spatrick break;
78e5dd7070Spatrick case BuiltinType::Int128:
79e5dd7070Spatrick ID = PREDEF_TYPE_INT128_ID;
80e5dd7070Spatrick break;
81e5dd7070Spatrick case BuiltinType::Half:
82e5dd7070Spatrick ID = PREDEF_TYPE_HALF_ID;
83e5dd7070Spatrick break;
84e5dd7070Spatrick case BuiltinType::Float:
85e5dd7070Spatrick ID = PREDEF_TYPE_FLOAT_ID;
86e5dd7070Spatrick break;
87e5dd7070Spatrick case BuiltinType::Double:
88e5dd7070Spatrick ID = PREDEF_TYPE_DOUBLE_ID;
89e5dd7070Spatrick break;
90e5dd7070Spatrick case BuiltinType::LongDouble:
91e5dd7070Spatrick ID = PREDEF_TYPE_LONGDOUBLE_ID;
92e5dd7070Spatrick break;
93e5dd7070Spatrick case BuiltinType::ShortAccum:
94e5dd7070Spatrick ID = PREDEF_TYPE_SHORT_ACCUM_ID;
95e5dd7070Spatrick break;
96e5dd7070Spatrick case BuiltinType::Accum:
97e5dd7070Spatrick ID = PREDEF_TYPE_ACCUM_ID;
98e5dd7070Spatrick break;
99e5dd7070Spatrick case BuiltinType::LongAccum:
100e5dd7070Spatrick ID = PREDEF_TYPE_LONG_ACCUM_ID;
101e5dd7070Spatrick break;
102e5dd7070Spatrick case BuiltinType::UShortAccum:
103e5dd7070Spatrick ID = PREDEF_TYPE_USHORT_ACCUM_ID;
104e5dd7070Spatrick break;
105e5dd7070Spatrick case BuiltinType::UAccum:
106e5dd7070Spatrick ID = PREDEF_TYPE_UACCUM_ID;
107e5dd7070Spatrick break;
108e5dd7070Spatrick case BuiltinType::ULongAccum:
109e5dd7070Spatrick ID = PREDEF_TYPE_ULONG_ACCUM_ID;
110e5dd7070Spatrick break;
111e5dd7070Spatrick case BuiltinType::ShortFract:
112e5dd7070Spatrick ID = PREDEF_TYPE_SHORT_FRACT_ID;
113e5dd7070Spatrick break;
114e5dd7070Spatrick case BuiltinType::Fract:
115e5dd7070Spatrick ID = PREDEF_TYPE_FRACT_ID;
116e5dd7070Spatrick break;
117e5dd7070Spatrick case BuiltinType::LongFract:
118e5dd7070Spatrick ID = PREDEF_TYPE_LONG_FRACT_ID;
119e5dd7070Spatrick break;
120e5dd7070Spatrick case BuiltinType::UShortFract:
121e5dd7070Spatrick ID = PREDEF_TYPE_USHORT_FRACT_ID;
122e5dd7070Spatrick break;
123e5dd7070Spatrick case BuiltinType::UFract:
124e5dd7070Spatrick ID = PREDEF_TYPE_UFRACT_ID;
125e5dd7070Spatrick break;
126e5dd7070Spatrick case BuiltinType::ULongFract:
127e5dd7070Spatrick ID = PREDEF_TYPE_ULONG_FRACT_ID;
128e5dd7070Spatrick break;
129e5dd7070Spatrick case BuiltinType::SatShortAccum:
130e5dd7070Spatrick ID = PREDEF_TYPE_SAT_SHORT_ACCUM_ID;
131e5dd7070Spatrick break;
132e5dd7070Spatrick case BuiltinType::SatAccum:
133e5dd7070Spatrick ID = PREDEF_TYPE_SAT_ACCUM_ID;
134e5dd7070Spatrick break;
135e5dd7070Spatrick case BuiltinType::SatLongAccum:
136e5dd7070Spatrick ID = PREDEF_TYPE_SAT_LONG_ACCUM_ID;
137e5dd7070Spatrick break;
138e5dd7070Spatrick case BuiltinType::SatUShortAccum:
139e5dd7070Spatrick ID = PREDEF_TYPE_SAT_USHORT_ACCUM_ID;
140e5dd7070Spatrick break;
141e5dd7070Spatrick case BuiltinType::SatUAccum:
142e5dd7070Spatrick ID = PREDEF_TYPE_SAT_UACCUM_ID;
143e5dd7070Spatrick break;
144e5dd7070Spatrick case BuiltinType::SatULongAccum:
145e5dd7070Spatrick ID = PREDEF_TYPE_SAT_ULONG_ACCUM_ID;
146e5dd7070Spatrick break;
147e5dd7070Spatrick case BuiltinType::SatShortFract:
148e5dd7070Spatrick ID = PREDEF_TYPE_SAT_SHORT_FRACT_ID;
149e5dd7070Spatrick break;
150e5dd7070Spatrick case BuiltinType::SatFract:
151e5dd7070Spatrick ID = PREDEF_TYPE_SAT_FRACT_ID;
152e5dd7070Spatrick break;
153e5dd7070Spatrick case BuiltinType::SatLongFract:
154e5dd7070Spatrick ID = PREDEF_TYPE_SAT_LONG_FRACT_ID;
155e5dd7070Spatrick break;
156e5dd7070Spatrick case BuiltinType::SatUShortFract:
157e5dd7070Spatrick ID = PREDEF_TYPE_SAT_USHORT_FRACT_ID;
158e5dd7070Spatrick break;
159e5dd7070Spatrick case BuiltinType::SatUFract:
160e5dd7070Spatrick ID = PREDEF_TYPE_SAT_UFRACT_ID;
161e5dd7070Spatrick break;
162e5dd7070Spatrick case BuiltinType::SatULongFract:
163e5dd7070Spatrick ID = PREDEF_TYPE_SAT_ULONG_FRACT_ID;
164e5dd7070Spatrick break;
165e5dd7070Spatrick case BuiltinType::Float16:
166e5dd7070Spatrick ID = PREDEF_TYPE_FLOAT16_ID;
167e5dd7070Spatrick break;
168e5dd7070Spatrick case BuiltinType::Float128:
169e5dd7070Spatrick ID = PREDEF_TYPE_FLOAT128_ID;
170e5dd7070Spatrick break;
171*12c85518Srobert case BuiltinType::Ibm128:
172*12c85518Srobert ID = PREDEF_TYPE_IBM128_ID;
173*12c85518Srobert break;
174e5dd7070Spatrick case BuiltinType::NullPtr:
175e5dd7070Spatrick ID = PREDEF_TYPE_NULLPTR_ID;
176e5dd7070Spatrick break;
177e5dd7070Spatrick case BuiltinType::Char8:
178e5dd7070Spatrick ID = PREDEF_TYPE_CHAR8_ID;
179e5dd7070Spatrick break;
180e5dd7070Spatrick case BuiltinType::Char16:
181e5dd7070Spatrick ID = PREDEF_TYPE_CHAR16_ID;
182e5dd7070Spatrick break;
183e5dd7070Spatrick case BuiltinType::Char32:
184e5dd7070Spatrick ID = PREDEF_TYPE_CHAR32_ID;
185e5dd7070Spatrick break;
186e5dd7070Spatrick case BuiltinType::Overload:
187e5dd7070Spatrick ID = PREDEF_TYPE_OVERLOAD_ID;
188e5dd7070Spatrick break;
189e5dd7070Spatrick case BuiltinType::BoundMember:
190e5dd7070Spatrick ID = PREDEF_TYPE_BOUND_MEMBER;
191e5dd7070Spatrick break;
192e5dd7070Spatrick case BuiltinType::PseudoObject:
193e5dd7070Spatrick ID = PREDEF_TYPE_PSEUDO_OBJECT;
194e5dd7070Spatrick break;
195e5dd7070Spatrick case BuiltinType::Dependent:
196e5dd7070Spatrick ID = PREDEF_TYPE_DEPENDENT_ID;
197e5dd7070Spatrick break;
198e5dd7070Spatrick case BuiltinType::UnknownAny:
199e5dd7070Spatrick ID = PREDEF_TYPE_UNKNOWN_ANY;
200e5dd7070Spatrick break;
201e5dd7070Spatrick case BuiltinType::ARCUnbridgedCast:
202e5dd7070Spatrick ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST;
203e5dd7070Spatrick break;
204e5dd7070Spatrick case BuiltinType::ObjCId:
205e5dd7070Spatrick ID = PREDEF_TYPE_OBJC_ID;
206e5dd7070Spatrick break;
207e5dd7070Spatrick case BuiltinType::ObjCClass:
208e5dd7070Spatrick ID = PREDEF_TYPE_OBJC_CLASS;
209e5dd7070Spatrick break;
210e5dd7070Spatrick case BuiltinType::ObjCSel:
211e5dd7070Spatrick ID = PREDEF_TYPE_OBJC_SEL;
212e5dd7070Spatrick break;
213e5dd7070Spatrick #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
214e5dd7070Spatrick case BuiltinType::Id: \
215e5dd7070Spatrick ID = PREDEF_TYPE_##Id##_ID; \
216e5dd7070Spatrick break;
217e5dd7070Spatrick #include "clang/Basic/OpenCLImageTypes.def"
218e5dd7070Spatrick #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
219e5dd7070Spatrick case BuiltinType::Id: \
220e5dd7070Spatrick ID = PREDEF_TYPE_##Id##_ID; \
221e5dd7070Spatrick break;
222e5dd7070Spatrick #include "clang/Basic/OpenCLExtensionTypes.def"
223e5dd7070Spatrick case BuiltinType::OCLSampler:
224e5dd7070Spatrick ID = PREDEF_TYPE_SAMPLER_ID;
225e5dd7070Spatrick break;
226e5dd7070Spatrick case BuiltinType::OCLEvent:
227e5dd7070Spatrick ID = PREDEF_TYPE_EVENT_ID;
228e5dd7070Spatrick break;
229e5dd7070Spatrick case BuiltinType::OCLClkEvent:
230e5dd7070Spatrick ID = PREDEF_TYPE_CLK_EVENT_ID;
231e5dd7070Spatrick break;
232e5dd7070Spatrick case BuiltinType::OCLQueue:
233e5dd7070Spatrick ID = PREDEF_TYPE_QUEUE_ID;
234e5dd7070Spatrick break;
235e5dd7070Spatrick case BuiltinType::OCLReserveID:
236e5dd7070Spatrick ID = PREDEF_TYPE_RESERVE_ID_ID;
237e5dd7070Spatrick break;
238e5dd7070Spatrick #define SVE_TYPE(Name, Id, SingletonId) \
239e5dd7070Spatrick case BuiltinType::Id: \
240e5dd7070Spatrick ID = PREDEF_TYPE_##Id##_ID; \
241e5dd7070Spatrick break;
242e5dd7070Spatrick #include "clang/Basic/AArch64SVEACLETypes.def"
243a9ac8606Spatrick #define PPC_VECTOR_TYPE(Name, Id, Size) \
244a9ac8606Spatrick case BuiltinType::Id: \
245a9ac8606Spatrick ID = PREDEF_TYPE_##Id##_ID; \
246a9ac8606Spatrick break;
247a9ac8606Spatrick #include "clang/Basic/PPCTypes.def"
248a9ac8606Spatrick #define RVV_TYPE(Name, Id, SingletonId) \
249a9ac8606Spatrick case BuiltinType::Id: \
250a9ac8606Spatrick ID = PREDEF_TYPE_##Id##_ID; \
251a9ac8606Spatrick break;
252a9ac8606Spatrick #include "clang/Basic/RISCVVTypes.def"
253e5dd7070Spatrick case BuiltinType::BuiltinFn:
254e5dd7070Spatrick ID = PREDEF_TYPE_BUILTIN_FN;
255e5dd7070Spatrick break;
256ec727ea7Spatrick case BuiltinType::IncompleteMatrixIdx:
257ec727ea7Spatrick ID = PREDEF_TYPE_INCOMPLETE_MATRIX_IDX;
258ec727ea7Spatrick break;
259e5dd7070Spatrick case BuiltinType::OMPArraySection:
260e5dd7070Spatrick ID = PREDEF_TYPE_OMP_ARRAY_SECTION;
261e5dd7070Spatrick break;
262ec727ea7Spatrick case BuiltinType::OMPArrayShaping:
263ec727ea7Spatrick ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
264ec727ea7Spatrick break;
265ec727ea7Spatrick case BuiltinType::OMPIterator:
266ec727ea7Spatrick ID = PREDEF_TYPE_OMP_ITERATOR;
267ec727ea7Spatrick break;
268ec727ea7Spatrick case BuiltinType::BFloat16:
269ec727ea7Spatrick ID = PREDEF_TYPE_BFLOAT16_ID;
270ec727ea7Spatrick break;
271e5dd7070Spatrick }
272e5dd7070Spatrick
273e5dd7070Spatrick return TypeIdx(ID);
274e5dd7070Spatrick }
275e5dd7070Spatrick
ComputeHash(Selector Sel)276e5dd7070Spatrick unsigned serialization::ComputeHash(Selector Sel) {
277e5dd7070Spatrick unsigned N = Sel.getNumArgs();
278e5dd7070Spatrick if (N == 0)
279e5dd7070Spatrick ++N;
280e5dd7070Spatrick unsigned R = 5381;
281e5dd7070Spatrick for (unsigned I = 0; I != N; ++I)
282e5dd7070Spatrick if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I))
283e5dd7070Spatrick R = llvm::djbHash(II->getName(), R);
284e5dd7070Spatrick return R;
285e5dd7070Spatrick }
286e5dd7070Spatrick
287e5dd7070Spatrick const DeclContext *
getDefinitiveDeclContext(const DeclContext * DC)288e5dd7070Spatrick serialization::getDefinitiveDeclContext(const DeclContext *DC) {
289e5dd7070Spatrick switch (DC->getDeclKind()) {
290e5dd7070Spatrick // These entities may have multiple definitions.
291e5dd7070Spatrick case Decl::TranslationUnit:
292e5dd7070Spatrick case Decl::ExternCContext:
293e5dd7070Spatrick case Decl::Namespace:
294e5dd7070Spatrick case Decl::LinkageSpec:
295e5dd7070Spatrick case Decl::Export:
296e5dd7070Spatrick return nullptr;
297e5dd7070Spatrick
298e5dd7070Spatrick // C/C++ tag types can only be defined in one place.
299e5dd7070Spatrick case Decl::Enum:
300e5dd7070Spatrick case Decl::Record:
301e5dd7070Spatrick if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
302e5dd7070Spatrick return Def;
303e5dd7070Spatrick return nullptr;
304e5dd7070Spatrick
305e5dd7070Spatrick // FIXME: These can be defined in one place... except special member
306e5dd7070Spatrick // functions and out-of-line definitions.
307e5dd7070Spatrick case Decl::CXXRecord:
308e5dd7070Spatrick case Decl::ClassTemplateSpecialization:
309e5dd7070Spatrick case Decl::ClassTemplatePartialSpecialization:
310e5dd7070Spatrick return nullptr;
311e5dd7070Spatrick
312e5dd7070Spatrick // Each function, method, and block declaration is its own DeclContext.
313e5dd7070Spatrick case Decl::Function:
314e5dd7070Spatrick case Decl::CXXMethod:
315e5dd7070Spatrick case Decl::CXXConstructor:
316e5dd7070Spatrick case Decl::CXXDestructor:
317e5dd7070Spatrick case Decl::CXXConversion:
318e5dd7070Spatrick case Decl::ObjCMethod:
319e5dd7070Spatrick case Decl::Block:
320e5dd7070Spatrick case Decl::Captured:
321e5dd7070Spatrick // Objective C categories, category implementations, and class
322e5dd7070Spatrick // implementations can only be defined in one place.
323e5dd7070Spatrick case Decl::ObjCCategory:
324e5dd7070Spatrick case Decl::ObjCCategoryImpl:
325e5dd7070Spatrick case Decl::ObjCImplementation:
326e5dd7070Spatrick return DC;
327e5dd7070Spatrick
328e5dd7070Spatrick case Decl::ObjCProtocol:
329e5dd7070Spatrick if (const ObjCProtocolDecl *Def
330e5dd7070Spatrick = cast<ObjCProtocolDecl>(DC)->getDefinition())
331e5dd7070Spatrick return Def;
332e5dd7070Spatrick return nullptr;
333e5dd7070Spatrick
334e5dd7070Spatrick // FIXME: These are defined in one place, but properties in class extensions
335e5dd7070Spatrick // end up being back-patched into the main interface. See
336e5dd7070Spatrick // Sema::HandlePropertyInClassExtension for the offending code.
337e5dd7070Spatrick case Decl::ObjCInterface:
338e5dd7070Spatrick return nullptr;
339e5dd7070Spatrick
340e5dd7070Spatrick default:
341e5dd7070Spatrick llvm_unreachable("Unhandled DeclContext in AST reader");
342e5dd7070Spatrick }
343e5dd7070Spatrick
344e5dd7070Spatrick llvm_unreachable("Unhandled decl kind");
345e5dd7070Spatrick }
346e5dd7070Spatrick
isRedeclarableDeclKind(unsigned Kind)347e5dd7070Spatrick bool serialization::isRedeclarableDeclKind(unsigned Kind) {
348e5dd7070Spatrick switch (static_cast<Decl::Kind>(Kind)) {
349e5dd7070Spatrick case Decl::TranslationUnit:
350e5dd7070Spatrick case Decl::ExternCContext:
351e5dd7070Spatrick // Special case of a "merged" declaration.
352e5dd7070Spatrick return true;
353e5dd7070Spatrick
354e5dd7070Spatrick case Decl::Namespace:
355e5dd7070Spatrick case Decl::NamespaceAlias:
356e5dd7070Spatrick case Decl::Typedef:
357e5dd7070Spatrick case Decl::TypeAlias:
358e5dd7070Spatrick case Decl::Enum:
359e5dd7070Spatrick case Decl::Record:
360e5dd7070Spatrick case Decl::CXXRecord:
361e5dd7070Spatrick case Decl::ClassTemplateSpecialization:
362e5dd7070Spatrick case Decl::ClassTemplatePartialSpecialization:
363e5dd7070Spatrick case Decl::VarTemplateSpecialization:
364e5dd7070Spatrick case Decl::VarTemplatePartialSpecialization:
365e5dd7070Spatrick case Decl::Function:
366e5dd7070Spatrick case Decl::CXXDeductionGuide:
367e5dd7070Spatrick case Decl::CXXMethod:
368e5dd7070Spatrick case Decl::CXXConstructor:
369e5dd7070Spatrick case Decl::CXXDestructor:
370e5dd7070Spatrick case Decl::CXXConversion:
371e5dd7070Spatrick case Decl::UsingShadow:
372e5dd7070Spatrick case Decl::ConstructorUsingShadow:
373e5dd7070Spatrick case Decl::Var:
374e5dd7070Spatrick case Decl::FunctionTemplate:
375e5dd7070Spatrick case Decl::ClassTemplate:
376e5dd7070Spatrick case Decl::VarTemplate:
377e5dd7070Spatrick case Decl::TypeAliasTemplate:
378e5dd7070Spatrick case Decl::ObjCProtocol:
379e5dd7070Spatrick case Decl::ObjCInterface:
380e5dd7070Spatrick case Decl::Empty:
381e5dd7070Spatrick return true;
382e5dd7070Spatrick
383e5dd7070Spatrick // Never redeclarable.
384e5dd7070Spatrick case Decl::UsingDirective:
385e5dd7070Spatrick case Decl::Label:
386e5dd7070Spatrick case Decl::UnresolvedUsingTypename:
387e5dd7070Spatrick case Decl::TemplateTypeParm:
388e5dd7070Spatrick case Decl::EnumConstant:
389e5dd7070Spatrick case Decl::UnresolvedUsingValue:
390e5dd7070Spatrick case Decl::IndirectField:
391e5dd7070Spatrick case Decl::Field:
392e5dd7070Spatrick case Decl::MSProperty:
393ec727ea7Spatrick case Decl::MSGuid:
394*12c85518Srobert case Decl::UnnamedGlobalConstant:
395a9ac8606Spatrick case Decl::TemplateParamObject:
396e5dd7070Spatrick case Decl::ObjCIvar:
397e5dd7070Spatrick case Decl::ObjCAtDefsField:
398e5dd7070Spatrick case Decl::NonTypeTemplateParm:
399e5dd7070Spatrick case Decl::TemplateTemplateParm:
400e5dd7070Spatrick case Decl::Using:
401a9ac8606Spatrick case Decl::UsingEnum:
402e5dd7070Spatrick case Decl::UsingPack:
403e5dd7070Spatrick case Decl::ObjCMethod:
404e5dd7070Spatrick case Decl::ObjCCategory:
405e5dd7070Spatrick case Decl::ObjCCategoryImpl:
406e5dd7070Spatrick case Decl::ObjCImplementation:
407e5dd7070Spatrick case Decl::ObjCProperty:
408e5dd7070Spatrick case Decl::ObjCCompatibleAlias:
409e5dd7070Spatrick case Decl::LinkageSpec:
410e5dd7070Spatrick case Decl::Export:
411e5dd7070Spatrick case Decl::ObjCPropertyImpl:
412e5dd7070Spatrick case Decl::PragmaComment:
413e5dd7070Spatrick case Decl::PragmaDetectMismatch:
414e5dd7070Spatrick case Decl::FileScopeAsm:
415*12c85518Srobert case Decl::TopLevelStmt:
416e5dd7070Spatrick case Decl::AccessSpec:
417e5dd7070Spatrick case Decl::Friend:
418e5dd7070Spatrick case Decl::FriendTemplate:
419e5dd7070Spatrick case Decl::StaticAssert:
420e5dd7070Spatrick case Decl::Block:
421e5dd7070Spatrick case Decl::Captured:
422e5dd7070Spatrick case Decl::ClassScopeFunctionSpecialization:
423e5dd7070Spatrick case Decl::Import:
424e5dd7070Spatrick case Decl::OMPThreadPrivate:
425e5dd7070Spatrick case Decl::OMPAllocate:
426e5dd7070Spatrick case Decl::OMPRequires:
427e5dd7070Spatrick case Decl::OMPCapturedExpr:
428e5dd7070Spatrick case Decl::OMPDeclareReduction:
429e5dd7070Spatrick case Decl::OMPDeclareMapper:
430e5dd7070Spatrick case Decl::BuiltinTemplate:
431e5dd7070Spatrick case Decl::Decomposition:
432e5dd7070Spatrick case Decl::Binding:
433e5dd7070Spatrick case Decl::Concept:
434*12c85518Srobert case Decl::ImplicitConceptSpecialization:
435e5dd7070Spatrick case Decl::LifetimeExtendedTemporary:
436e5dd7070Spatrick case Decl::RequiresExprBody:
437a9ac8606Spatrick case Decl::UnresolvedUsingIfExists:
438*12c85518Srobert case Decl::HLSLBuffer:
439e5dd7070Spatrick return false;
440e5dd7070Spatrick
441e5dd7070Spatrick // These indirectly derive from Redeclarable<T> but are not actually
442e5dd7070Spatrick // redeclarable.
443e5dd7070Spatrick case Decl::ImplicitParam:
444e5dd7070Spatrick case Decl::ParmVar:
445e5dd7070Spatrick case Decl::ObjCTypeParam:
446e5dd7070Spatrick return false;
447e5dd7070Spatrick }
448e5dd7070Spatrick
449e5dd7070Spatrick llvm_unreachable("Unhandled declaration kind");
450e5dd7070Spatrick }
451e5dd7070Spatrick
needsAnonymousDeclarationNumber(const NamedDecl * D)452e5dd7070Spatrick bool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) {
453e5dd7070Spatrick // Friend declarations in dependent contexts aren't anonymous in the usual
454e5dd7070Spatrick // sense, but they cannot be found by name lookup in their semantic context
455e5dd7070Spatrick // (or indeed in any context), so we treat them as anonymous.
456e5dd7070Spatrick //
457e5dd7070Spatrick // This doesn't apply to friend tag decls; Sema makes those available to name
458e5dd7070Spatrick // lookup in the surrounding context.
459e5dd7070Spatrick if (D->getFriendObjectKind() &&
460e5dd7070Spatrick D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) {
461e5dd7070Spatrick // For function templates and class templates, the template is numbered and
462e5dd7070Spatrick // not its pattern.
463e5dd7070Spatrick if (auto *FD = dyn_cast<FunctionDecl>(D))
464e5dd7070Spatrick return !FD->getDescribedFunctionTemplate();
465e5dd7070Spatrick if (auto *RD = dyn_cast<CXXRecordDecl>(D))
466e5dd7070Spatrick return !RD->getDescribedClassTemplate();
467e5dd7070Spatrick return true;
468e5dd7070Spatrick }
469e5dd7070Spatrick
470e5dd7070Spatrick // At block scope, we number everything that we need to deduplicate, since we
471e5dd7070Spatrick // can't just use name matching to keep things lined up.
472e5dd7070Spatrick // FIXME: This is only necessary for an inline function or a template or
473e5dd7070Spatrick // similar.
474e5dd7070Spatrick if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
475e5dd7070Spatrick if (auto *VD = dyn_cast<VarDecl>(D))
476e5dd7070Spatrick return VD->isStaticLocal();
477e5dd7070Spatrick // FIXME: What about CapturedDecls (and declarations nested within them)?
478*12c85518Srobert return isa<TagDecl, BlockDecl>(D);
479e5dd7070Spatrick }
480e5dd7070Spatrick
481e5dd7070Spatrick // Otherwise, we only care about anonymous class members / block-scope decls.
482e5dd7070Spatrick // FIXME: We need to handle lambdas and blocks within inline / templated
483e5dd7070Spatrick // variables too.
484*12c85518Srobert if (D->getDeclName())
485e5dd7070Spatrick return false;
486*12c85518Srobert if (!isa<RecordDecl, ObjCInterfaceDecl>(D->getLexicalDeclContext()))
487*12c85518Srobert return false;
488*12c85518Srobert return isa<TagDecl, FieldDecl>(D);
489e5dd7070Spatrick }
490