clang 24.0.0git
ASTWriterDecl.cpp
Go to the documentation of this file.
1//===--- ASTWriterDecl.cpp - Declaration Serialization --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements serialization for Declarations.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ASTCommon.h"
14#include "clang/AST/Attr.h"
15#include "clang/AST/DeclCXX.h"
18#include "clang/AST/Expr.h"
24#include "llvm/Bitstream/BitstreamWriter.h"
25#include "llvm/Support/ErrorHandling.h"
26using namespace clang;
27using namespace serialization;
28
29//===----------------------------------------------------------------------===//
30// Utility functions
31//===----------------------------------------------------------------------===//
32
33namespace {
34
35// Helper function that returns true if the decl passed in the argument is
36// a defintion in dependent contxt.
37template <typename DT> bool isDefinitionInDependentContext(DT *D) {
38 return D->isDependentContext() && D->isThisDeclarationADefinition();
39}
40
41} // namespace
42
43//===----------------------------------------------------------------------===//
44// Declaration serialization
45//===----------------------------------------------------------------------===//
46
47namespace clang {
48 class ASTDeclWriter : public DeclVisitor<ASTDeclWriter, void> {
49 ASTWriter &Writer;
50 ASTRecordWriter Record;
51
53 unsigned AbbrevToUse;
54
55 bool GeneratingReducedBMI = false;
56
57 public:
59 ASTWriter::RecordDataImpl &Record, bool GeneratingReducedBMI)
60 : Writer(Writer), Record(Context, Writer, Record),
61 Code((serialization::DeclCode)0), AbbrevToUse(0),
62 GeneratingReducedBMI(GeneratingReducedBMI) {}
63
64 uint64_t Emit(Decl *D) {
65 if (!Code)
66 llvm::report_fatal_error(StringRef("unexpected declaration kind '") +
67 D->getDeclKindName() + "'");
68 return Record.Emit(Code, AbbrevToUse);
69 }
70
71 void Visit(Decl *D);
72
73 void VisitDecl(Decl *D);
78 void VisitLabelDecl(LabelDecl *LD);
82 void VisitTypeDecl(TypeDecl *D);
88 void VisitTagDecl(TagDecl *D);
89 void VisitEnumDecl(EnumDecl *D);
100 void VisitValueDecl(ValueDecl *D);
110 void VisitFieldDecl(FieldDecl *D);
116 void VisitVarDecl(VarDecl *D);
133 void VisitUsingDecl(UsingDecl *D);
149 void VisitBlockDecl(BlockDecl *D);
152 void VisitEmptyDecl(EmptyDecl *D);
155 template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
157
158 // FIXME: Put in the same order is DeclNodes.td?
179
182
183 /// Add an Objective-C type parameter list to the given record.
185 // Empty type parameter list.
186 if (!typeParams) {
187 Record.push_back(0);
188 return;
189 }
190
191 Record.push_back(typeParams->size());
192 for (auto *typeParam : *typeParams) {
193 Record.AddDeclRef(typeParam);
194 }
195 Record.AddSourceLocation(typeParams->getLAngleLoc());
196 Record.AddSourceLocation(typeParams->getRAngleLoc());
197 }
198
199 /// Add to the record the first declaration from each module file that
200 /// provides a declaration of D. The intent is to provide a sufficient
201 /// set such that reloading this set will load all current redeclarations.
202 void AddFirstDeclFromEachModule(const Decl *D, bool IncludeLocal) {
203 auto Firsts = Writer.CollectFirstDeclFromEachModule(D, IncludeLocal);
204 for (const auto &[_, First] : Firsts)
205 Record.AddDeclRef(First);
206 }
207
208 template <typename T> bool shouldSkipWritingSpecializations(T *Spec) {
209 // Now we will only avoid writing specializations if we're generating
210 // reduced BMI.
211 if (!GeneratingReducedBMI)
212 return false;
213
216
218 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
219 Args = CTSD->getTemplateArgs().asArray();
220 else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
221 Args = VTSD->getTemplateArgs().asArray();
222 else
223 Args = cast<FunctionDecl>(Spec)
224 ->getTemplateSpecializationArgs()
225 ->asArray();
226
227 // If there is any template argument is TULocal, we can avoid writing the
228 // specialization since the consumers of reduced BMI won't get the
229 // specialization anyway.
230 for (const TemplateArgument &TA : Args) {
231 switch (TA.getKind()) {
233 Linkage L = TA.getAsType()->getLinkage();
234 if (!isExternallyVisible(L))
235 return true;
236 break;
237 }
239 if (!TA.getAsDecl()->isExternallyVisible())
240 return true;
241 break;
242 default:
243 break;
244 }
245 }
246
247 return false;
248 }
249
250 /// Add to the record the first template specialization from each module
251 /// file that provides a declaration of D. We store the DeclId and an
252 /// ODRHash of the template arguments of D which should provide enough
253 /// information to load D only if the template instantiator needs it.
255 const Decl *D, llvm::SmallVectorImpl<const Decl *> &SpecsInMap,
256 llvm::SmallVectorImpl<const Decl *> &PartialSpecsInMap) {
259 "Must not be called with other decls");
260 auto Firsts =
261 Writer.CollectFirstDeclFromEachModule(D, /*IncludeLocal=*/true);
262 for (const auto &[_, First] : Firsts) {
264 continue;
265
268 PartialSpecsInMap.push_back(First);
269 else
270 SpecsInMap.push_back(First);
271 }
272 }
273
274 /// Get the specialization decl from an entry in the specialization list.
275 template <typename EntryType>
280
281 /// Get the list of partial specializations from a template's common ptr.
282 template<typename T>
283 decltype(T::PartialSpecializations) &getPartialSpecializations(T *Common) {
284 return Common->PartialSpecializations;
285 }
290
291 template<typename DeclTy>
293 auto *Common = D->getCommonPtr();
294
295 // If we have any lazy specializations, and the external AST source is
296 // our chained AST reader, we can just write out the DeclIDs. Otherwise,
297 // we need to resolve them to actual declarations.
298 if (Writer.Chain != Record.getASTContext().getExternalSource() &&
299 Writer.Chain && Writer.Chain->haveUnloadedSpecializations(D)) {
300 D->LoadLazySpecializations();
301 assert(!Writer.Chain->haveUnloadedSpecializations(D));
302 }
303
304 // AddFirstSpecializationDeclFromEachModule might trigger deserialization,
305 // invalidating *Specializations iterators.
307 for (auto &Entry : Common->Specializations)
308 AllSpecs.push_back(getSpecializationDecl(Entry));
309 for (auto &Entry : getPartialSpecializations(Common))
310 AllSpecs.push_back(getSpecializationDecl(Entry));
311
314 for (auto *D : AllSpecs) {
315 assert(D->isCanonicalDecl() && "non-canonical decl in set");
316 AddFirstSpecializationDeclFromEachModule(D, Specs, PartialSpecs);
317 }
318
319 Record.AddOffset(Writer.WriteSpecializationInfoLookupTable(
320 D, Specs, /*IsPartial=*/false));
321
322 // Function Template Decl doesn't have partial decls.
324 assert(PartialSpecs.empty());
325 return;
326 }
327
328 Record.AddOffset(Writer.WriteSpecializationInfoLookupTable(
329 D, PartialSpecs, /*IsPartial=*/true));
330 }
331
332 /// Ensure that this template specialization is associated with the specified
333 /// template on reload.
335 const Decl *Specialization) {
336 Template = Template->getCanonicalDecl();
337
338 // If the canonical template is local, we'll write out this specialization
339 // when we emit it.
340 // FIXME: We can do the same thing if there is any local declaration of
341 // the template, to avoid emitting an update record.
342 if (!Template->isFromASTFile())
343 return;
344
345 // We only need to associate the first local declaration of the
346 // specialization. The other declarations will get pulled in by it.
347 if (Writer.getFirstLocalDecl(Specialization) != Specialization)
348 return;
349
352 Writer.PartialSpecializationsUpdates[cast<NamedDecl>(Template)]
353 .push_back(cast<NamedDecl>(Specialization));
354 else
355 Writer.SpecializationsUpdates[cast<NamedDecl>(Template)].push_back(
357 }
358 };
359}
360
361// When building a C++20 module interface unit or a partition unit, a
362// strong definition in the module interface is provided by the
363// compilation of that unit, not by its users. (Inline variables are still
364// emitted in module users.)
365static bool shouldVarGenerateHereOnly(const VarDecl *VD) {
366 if (VD->getStorageDuration() != SD_Static &&
368 return false;
369
370 if (VD->getDescribedVarTemplate())
371 return false;
372
373 Module *M = VD->getOwningModule();
374 if (!M)
375 return false;
376
377 M = M->getTopLevelModule();
378 ASTContext &Ctx = VD->getASTContext();
379 if (!M->isInterfaceOrPartition() &&
380 (!VD->hasAttr<DLLExportAttr>() ||
381 !Ctx.getLangOpts().BuildingPCHWithObjectFile))
382 return false;
383
385}
386
388 if (FD->isDependentContext())
389 return false;
390
391 ASTContext &Ctx = FD->getASTContext();
392 auto Linkage = Ctx.GetGVALinkageForFunction(FD);
393 if (Ctx.getLangOpts().ModulesCodegen ||
394 (FD->hasAttr<DLLExportAttr>() &&
395 Ctx.getLangOpts().BuildingPCHWithObjectFile))
396 // Under -fmodules-codegen, codegen is performed for all non-internal,
397 // non-always_inline functions, unless they are available elsewhere.
398 if (!FD->hasAttr<AlwaysInlineAttr>() && Linkage != GVA_Internal &&
400 return true;
401
402 Module *M = FD->getOwningModule();
403 if (!M)
404 return false;
405
406 M = M->getTopLevelModule();
407 if (M->isInterfaceOrPartition())
409 return true;
410
411 return false;
412}
413
415 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
416 if (FD->isInlined() || FD->isConstexpr() || FD->isConsteval())
417 return false;
418
419 // If the function should be generated somewhere else, we shouldn't elide
420 // it.
422 return false;
423 }
424
425 if (auto *VD = dyn_cast<VarDecl>(D)) {
426 if (VD->getDeclContext()->isDependentContext())
427 return false;
428
429 // Constant initialized variable may not affect the ABI, but they
430 // may be used in constant evaluation in the frontend, so we have
431 // to remain them.
432 if (VD->hasConstantInitialization() || VD->isConstexpr())
433 return false;
434
435 // If the variable should be generated somewhere else, we shouldn't elide
436 // it.
438 return false;
439 }
440
441 return true;
442}
443
446
447 // Source locations require array (variable-length) abbreviations. The
448 // abbreviation infrastructure requires that arrays are encoded last, so
449 // we handle it here in the case of those classes derived from DeclaratorDecl
450 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
451 if (auto *TInfo = DD->getTypeSourceInfo())
452 Record.AddTypeLoc(TInfo->getTypeLoc());
453 }
454
455 // Handle FunctionDecl's body here and write it after all other Stmts/Exprs
456 // have been written. We want it last because we will not read it back when
457 // retrieving it from the AST, we'll just lazily set the offset.
458 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
459 if (!GeneratingReducedBMI || !CanElideDeclDef(FD)) {
460 Record.push_back(FD->doesThisDeclarationHaveABody());
461 if (FD->doesThisDeclarationHaveABody())
462 Record.AddFunctionDefinition(FD);
463 } else
464 Record.push_back(0);
465 }
466
467 // Similar to FunctionDecls, handle VarDecl's initializer here and write it
468 // after all other Stmts/Exprs. We will not read the initializer until after
469 // we have finished recursive deserialization, because it can recursively
470 // refer back to the variable.
471 if (auto *VD = dyn_cast<VarDecl>(D)) {
472 if (!GeneratingReducedBMI || !CanElideDeclDef(VD))
473 Record.AddVarDeclInit(VD);
474 else
475 Record.push_back(0);
476 }
477
478 // And similarly for FieldDecls. We already serialized whether there is a
479 // default member initializer.
480 if (auto *FD = dyn_cast<FieldDecl>(D)) {
481 if (FD->hasInClassInitializer()) {
482 if (Expr *Init = FD->getInClassInitializer()) {
483 Record.push_back(1);
484 Record.AddStmt(Init);
485 } else {
486 Record.push_back(0);
487 // Initializer has not been instantiated yet.
488 }
489 }
490 }
491
492 // If this declaration is also a DeclContext, write blocks for the
493 // declarations that lexically stored inside its context and those
494 // declarations that are visible from its context.
495 if (auto *DC = dyn_cast<DeclContext>(D))
497}
498
500 BitsPacker DeclBits;
501
502 // The order matters here. It will be better to put the bit with higher
503 // probability to be 0 in the end of the bits.
504 //
505 // Since we're using VBR6 format to store it.
506 // It will be pretty effient if all the higher bits are 0.
507 // For example, if we need to pack 8 bits into a value and the stored value
508 // is 0xf0, the actual stored value will be 0b000111'110000, which takes 12
509 // bits actually. However, if we changed the order to be 0x0f, then we can
510 // store it as 0b001111, which takes 6 bits only now.
511 DeclBits.addBits((uint64_t)D->getModuleOwnershipKind(), /*BitWidth=*/3);
512 DeclBits.addBit(D->isThisDeclarationReferenced());
513 // If we're writing a BMI for a named module unit, we can treat all decls as in
514 // the BMI as used. Otherwise, the consumer need to mark it as used again, this
515 // simply waste time.
516 DeclBits.addBit(Writer.isWritingStdCXXNamedModules() ? true : D->isUsed(false));
517 DeclBits.addBits(D->getAccess(), /*BitWidth=*/2);
518 DeclBits.addBit(D->isImplicit());
519 DeclBits.addBit(D->getDeclContext() != D->getLexicalDeclContext());
520 DeclBits.addBit(D->hasAttrs());
522 DeclBits.addBit(D->isInvalidDecl());
523 Record.push_back(DeclBits);
524
525 Record.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()));
526 if (D->getDeclContext() != D->getLexicalDeclContext())
527 Record.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()));
528
529 if (D->hasAttrs())
530 Record.AddAttributes(D->getAttrs());
531
532 Record.push_back(Writer.getSubmoduleID(D->getOwningModule()));
533
534 // If this declaration injected a name into a context different from its
535 // lexical context, and that context is an imported namespace, we need to
536 // update its visible declarations to include this name.
537 //
538 // This happens when we instantiate a class with a friend declaration or a
539 // function with a local extern declaration, for instance.
540 //
541 // FIXME: Can we handle this in AddedVisibleDecl instead?
542 if (D->isOutOfLine()) {
543 auto *DC = D->getDeclContext();
544 while (auto *NS = dyn_cast<NamespaceDecl>(DC->getRedeclContext())) {
545 if (!NS->isFromASTFile())
546 break;
547 Writer.UpdatedDeclContexts.insert(NS->getPrimaryContext());
548 if (!NS->isInlineNamespace())
549 break;
550 DC = NS->getParent();
551 }
552 }
553}
554
556 StringRef Arg = D->getArg();
557 Record.push_back(Arg.size());
558 VisitDecl(D);
559 Record.AddSourceLocation(D->getBeginLoc());
560 Record.push_back(D->getCommentKind());
561 Record.AddString(Arg);
563}
564
567 StringRef Name = D->getName();
568 StringRef Value = D->getValue();
569 Record.push_back(Name.size() + 1 + Value.size());
570 VisitDecl(D);
571 Record.AddSourceLocation(D->getBeginLoc());
572 Record.AddString(Name);
573 Record.AddString(Value);
575}
576
578 llvm_unreachable("Translation units aren't directly serialized");
579}
580
582 VisitDecl(D);
583 Record.AddDeclarationName(D->getDeclName());
584 Record.push_back(needsAnonymousDeclarationNumber(D)
585 ? Writer.getAnonymousDeclarationNumber(D)
586 : 0);
587}
588
591 Record.AddSourceLocation(D->getBeginLoc());
593 Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
594}
595
598 VisitTypeDecl(D);
599 Record.AddTypeSourceInfo(D->getTypeSourceInfo());
600 Record.push_back(D->isModed());
601 if (D->isModed())
602 Record.AddTypeRef(D->getUnderlyingType());
603 Record.AddDeclRef(D->getAnonDeclWithTypedefName(false));
604}
605
608 if (D->getDeclContext() == D->getLexicalDeclContext() &&
609 !D->hasAttrs() &&
610 !D->isImplicit() &&
611 D->getFirstDecl() == D->getMostRecentDecl() &&
612 !D->isInvalidDecl() &&
614 !D->isModulePrivate() &&
617 AbbrevToUse = Writer.getDeclTypedefAbbrev();
618
620}
621
627
629 static_assert(DeclContext::NumTagDeclBits == 23,
630 "You need to update the serializer after you change the "
631 "TagDeclBits");
632
634 VisitTypeDecl(D);
635 Record.push_back(D->getIdentifierNamespace());
636
637 BitsPacker TagDeclBits;
638 TagDeclBits.addBits(llvm::to_underlying(D->getTagKind()), /*BitWidth=*/3);
639 TagDeclBits.addBit(!isa<CXXRecordDecl>(D) ? D->isCompleteDefinition() : 0);
640 TagDeclBits.addBit(D->isEmbeddedInDeclarator());
641 TagDeclBits.addBit(D->isFreeStanding());
642 TagDeclBits.addBit(D->isCompleteDefinitionRequired());
643 TagDeclBits.addBits(
644 D->hasExtInfo() ? 1 : (D->getTypedefNameForAnonDecl() ? 2 : 0),
645 /*BitWidth=*/2);
646 Record.push_back(TagDeclBits);
647
648 Record.AddSourceRange(D->getBraceRange());
649
650 if (D->hasExtInfo()) {
651 Record.AddQualifierInfo(*D->getExtInfo());
652 } else if (auto *TD = D->getTypedefNameForAnonDecl()) {
653 Record.AddDeclRef(TD);
654 Record.AddIdentifierRef(TD->getDeclName().getAsIdentifierInfo());
655 }
656}
657
659 static_assert(DeclContext::NumEnumDeclBits == 43,
660 "You need to update the serializer after you change the "
661 "EnumDeclBits");
662
663 VisitTagDecl(D);
664 Record.AddTypeSourceInfo(D->getIntegerTypeSourceInfo());
665 if (!D->getIntegerTypeSourceInfo())
666 Record.AddTypeRef(D->getIntegerType());
667 Record.AddTypeRef(D->getPromotionType());
668
669 BitsPacker EnumDeclBits;
670 EnumDeclBits.addBits(D->getNumPositiveBits(), /*BitWidth=*/8);
671 EnumDeclBits.addBits(D->getNumNegativeBits(), /*BitWidth=*/8);
672 EnumDeclBits.addBit(D->isScoped());
673 EnumDeclBits.addBit(D->isScopedUsingClassTag());
674 EnumDeclBits.addBit(D->isFixed());
675 Record.push_back(EnumDeclBits);
676
677 Record.push_back(D->getODRHash());
678
680 Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
681 Record.push_back(MemberInfo->getTemplateSpecializationKind());
682 Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
683 } else {
684 Record.AddDeclRef(nullptr);
685 }
686
687 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
688 !D->isInvalidDecl() && !D->isImplicit() && !D->hasExtInfo() &&
690 D->getFirstDecl() == D->getMostRecentDecl() &&
696 AbbrevToUse = Writer.getDeclEnumAbbrev();
697
699}
700
702 static_assert(DeclContext::NumRecordDeclBits == 64,
703 "You need to update the serializer after you change the "
704 "RecordDeclBits");
705
706 VisitTagDecl(D);
707
708 BitsPacker RecordDeclBits;
709 RecordDeclBits.addBit(D->hasFlexibleArrayMember());
710 RecordDeclBits.addBit(D->isAnonymousStructOrUnion());
711 RecordDeclBits.addBit(D->hasObjectMember());
712 RecordDeclBits.addBit(D->hasVolatileMember());
714 RecordDeclBits.addBit(D->isNonTrivialToPrimitiveCopy());
715 RecordDeclBits.addBit(D->isNonTrivialToPrimitiveDestroy());
718 RecordDeclBits.addBit(D->hasNonTrivialToPrimitiveCopyCUnion());
719 RecordDeclBits.addBit(D->hasUninitializedExplicitInitFields());
720 RecordDeclBits.addBit(D->isParamDestroyedInCallee());
721 RecordDeclBits.addBits(llvm::to_underlying(D->getArgPassingRestrictions()), 2);
722 Record.push_back(RecordDeclBits);
723
724 // Only compute this for C/Objective-C, in C++ this is computed as part
725 // of CXXRecordDecl.
726 if (!isa<CXXRecordDecl>(D))
727 Record.push_back(D->getODRHash());
728
729 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
730 !D->isImplicit() && !D->isInvalidDecl() && !D->hasExtInfo() &&
732 D->getFirstDecl() == D->getMostRecentDecl() &&
737 AbbrevToUse = Writer.getDeclRecordAbbrev();
738
740}
741
744 Record.AddTypeRef(D->getType());
745}
746
749 Record.push_back(D->getInitExpr()? 1 : 0);
750 if (D->getInitExpr())
751 Record.AddStmt(D->getInitExpr());
752 Record.AddAPSInt(D->getInitVal());
753
755}
756
759 Record.AddSourceLocation(D->getInnerLocStart());
760 Record.push_back(D->hasExtInfo());
761 if (D->hasExtInfo()) {
762 DeclaratorDecl::ExtInfo *Info = D->getExtInfo();
763 Record.AddQualifierInfo(*Info);
764 Record.AddStmt(
765 const_cast<Expr *>(Info->TrailingRequiresClause.ConstraintExpr));
766 Record.writeUnsignedOrNone(Info->TrailingRequiresClause.ArgPackSubstIndex);
767 }
768 // The location information is deferred until the end of the record.
769 Record.AddTypeRef(D->getTypeSourceInfo() ? D->getTypeSourceInfo()->getType()
770 : QualType());
771}
772
774 static_assert(DeclContext::NumFunctionDeclBits == 45,
775 "You need to update the serializer after you change the "
776 "FunctionDeclBits");
777
779
780 Record.push_back(D->getTemplatedKind());
781 switch (D->getTemplatedKind()) {
783 break;
785 Record.AddDeclRef(D->getInstantiatedFromDecl());
786 break;
788 Record.AddDeclRef(D->getDescribedFunctionTemplate());
789 break;
792 Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
793 Record.push_back(MemberInfo->getTemplateSpecializationKind());
794 Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
795 break;
796 }
799 FTSInfo = D->getTemplateSpecializationInfo();
800
802
803 Record.AddDeclRef(FTSInfo->getTemplate());
804 Record.push_back(FTSInfo->getTemplateSpecializationKind());
805
806 // Template arguments.
807 Record.AddTemplateArgumentList(FTSInfo->TemplateArguments);
808
809 // Template args as written.
810 Record.push_back(FTSInfo->TemplateArgumentsAsWritten != nullptr);
811 if (FTSInfo->TemplateArgumentsAsWritten)
812 Record.AddASTTemplateArgumentListInfo(
814
815 Record.AddSourceLocation(FTSInfo->getPointOfInstantiation());
816
817 if (MemberSpecializationInfo *MemberInfo =
818 FTSInfo->getMemberSpecializationInfo()) {
819 Record.push_back(1);
820 Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
821 Record.push_back(MemberInfo->getTemplateSpecializationKind());
822 Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
823 } else {
824 Record.push_back(0);
825 }
826
827 if (D->isCanonicalDecl()) {
828 // Write the template that contains the specializations set. We will
829 // add a FunctionTemplateSpecializationInfo to it when reading.
830 Record.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl());
831 }
832 break;
833 }
836 DFTSInfo = D->getDependentSpecializationInfo();
837
838 // Candidates.
839 Record.push_back(DFTSInfo->getCandidates().size());
840 for (FunctionTemplateDecl *FTD : DFTSInfo->getCandidates())
841 Record.AddDeclRef(FTD);
842
843 // Templates args.
844 Record.push_back(DFTSInfo->TemplateArgumentsAsWritten != nullptr);
845 if (DFTSInfo->TemplateArgumentsAsWritten)
846 Record.AddASTTemplateArgumentListInfo(
848 break;
849 }
850 }
851
853 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
854 Record.push_back(D->getIdentifierNamespace());
855
856 // The order matters here. It will be better to put the bit with higher
857 // probability to be 0 in the end of the bits. See the comments in VisitDecl
858 // for details.
859 BitsPacker FunctionDeclBits;
860 // FIXME: stable encoding
861 FunctionDeclBits.addBits(llvm::to_underlying(D->getLinkageInternal()), 3);
862 FunctionDeclBits.addBits((uint32_t)D->getStorageClass(), /*BitWidth=*/3);
863 FunctionDeclBits.addBit(D->isInlineSpecified());
864 FunctionDeclBits.addBit(D->isInlined());
865 FunctionDeclBits.addBit(D->hasSkippedBody());
866 FunctionDeclBits.addBit(D->isVirtualAsWritten());
867 FunctionDeclBits.addBit(D->isPureVirtual());
868 FunctionDeclBits.addBit(D->hasInheritedPrototype());
869 FunctionDeclBits.addBit(D->hasWrittenPrototype());
870 FunctionDeclBits.addBit(D->isDeletedBit());
871 FunctionDeclBits.addBit(D->isTrivial());
872 FunctionDeclBits.addBit(D->isTrivialForCall());
873 FunctionDeclBits.addBit(D->isDefaulted());
874 FunctionDeclBits.addBit(D->isExplicitlyDefaulted());
875 FunctionDeclBits.addBit(D->isIneligibleOrNotSelected());
876 FunctionDeclBits.addBits((uint64_t)(D->getConstexprKind()), /*BitWidth=*/2);
877 FunctionDeclBits.addBit(D->hasImplicitReturnZero());
878 FunctionDeclBits.addBit(D->isMultiVersion());
879 FunctionDeclBits.addBit(D->isLateTemplateParsed());
880 FunctionDeclBits.addBit(D->isInstantiatedFromMemberTemplate());
882 FunctionDeclBits.addBit(D->usesSEHTry());
883 FunctionDeclBits.addBit(D->isDestroyingOperatorDelete());
884 FunctionDeclBits.addBit(D->isTypeAwareOperatorNewOrDelete());
885 Record.push_back(FunctionDeclBits);
886
887 Record.AddSourceLocation(D->getEndLoc());
888 if (D->isExplicitlyDefaulted())
889 Record.AddSourceLocation(D->getDefaultLoc());
890
891 Record.push_back(D->getODRHash());
892
893 if (D->isDefaulted() || D->isDeletedAsWritten()) {
894 if (auto *FDI = D->getDefaultedOrDeletedInfo()) {
895 // Store both that there is an DefaultedOrDeletedInfo and whether it
896 // contains a DeletedMessage.
897 StringLiteral *DeletedMessage = FDI->getDeletedMessage();
898 Record.push_back(1 | (DeletedMessage ? 2 : 0));
899 if (DeletedMessage)
900 Record.AddStmt(DeletedMessage);
901
902 Record.push_back(FDI->getFPFeatures().getAsOpaqueInt());
903
904 Record.push_back(FDI->getUnqualifiedLookups().size());
905 for (DeclAccessPair P : FDI->getUnqualifiedLookups()) {
906 Record.AddDeclRef(P.getDecl());
907 Record.push_back(P.getAccess());
908 }
909 } else {
910 Record.push_back(0);
911 }
912 }
913
914 if (D->getFriendObjectKind()) {
915 // For a friend function defined inline within a class template, we have to
916 // force the definition to be the one inside the definition of the template
917 // class. Remember this relation to deserialize them together.
918 if (auto *RD = dyn_cast<CXXRecordDecl>(D->getLexicalParent());
919 RD && isDefinitionInDependentContext(RD)) {
920 Writer.RelatedDeclsMap[Writer.GetDeclRef(RD)].push_back(
921 Writer.GetDeclRef(D));
922 }
923 }
924
925 // Ensure associated ExplicitInstantiationDecls survive reduced BMI.
926 for (auto *EID : Record.getASTContext().getExplicitInstantiationDecls(D))
927 Writer.GetDeclRef(EID);
928
929 Record.push_back(D->param_size());
930 for (auto *P : D->parameters())
931 Record.AddDeclRef(P);
933}
934
937 uint64_t Kind = static_cast<uint64_t>(ES.getKind());
938 Kind = Kind << 1 | static_cast<bool>(ES.getExpr());
939 Record.push_back(Kind);
940 if (ES.getExpr()) {
941 Record.AddStmt(ES.getExpr());
942 }
943}
944
947 Record.AddDeclRef(D->Ctor);
949 Record.push_back(static_cast<unsigned char>(D->getDeductionCandidateKind()));
950 Record.AddDeclRef(D->getSourceDeductionGuide());
951 Record.push_back(
952 static_cast<unsigned char>(D->getSourceDeductionGuideKind()));
954}
955
957 static_assert(DeclContext::NumObjCMethodDeclBits == 37,
958 "You need to update the serializer after you change the "
959 "ObjCMethodDeclBits");
960
962 // FIXME: convert to LazyStmtPtr?
963 // Unlike C/C++, method bodies will never be in header files.
964 bool HasBodyStuff = D->getBody() != nullptr;
965 Record.push_back(HasBodyStuff);
966 if (HasBodyStuff) {
967 Record.AddStmt(D->getBody());
968 }
969 Record.AddDeclRef(D->getSelfDecl());
970 Record.AddDeclRef(D->getCmdDecl());
971 Record.push_back(D->isInstanceMethod());
972 Record.push_back(D->isVariadic());
973 Record.push_back(D->isPropertyAccessor());
974 Record.push_back(D->isSynthesizedAccessorStub());
975 Record.push_back(D->isDefined());
976 Record.push_back(D->isOverriding());
977 Record.push_back(D->hasSkippedBody());
978
979 Record.push_back(D->isRedeclaration());
980 Record.push_back(D->hasRedeclaration());
981 if (D->hasRedeclaration()) {
982 assert(Record.getASTContext().getObjCMethodRedeclaration(D));
983 Record.AddDeclRef(Record.getASTContext().getObjCMethodRedeclaration(D));
984 }
985
986 // FIXME: stable encoding for @required/@optional
987 Record.push_back(llvm::to_underlying(D->getImplementationControl()));
988 // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway/nullability
989 Record.push_back(D->getObjCDeclQualifier());
990 Record.push_back(D->hasRelatedResultType());
991 Record.AddTypeRef(D->getReturnType());
992 Record.AddTypeSourceInfo(D->getReturnTypeSourceInfo());
993 Record.AddSourceLocation(D->getEndLoc());
994 Record.push_back(D->param_size());
995 for (const auto *P : D->parameters())
996 Record.AddDeclRef(P);
997
998 Record.push_back(D->getSelLocsKind());
999 unsigned NumStoredSelLocs = D->getNumStoredSelLocs();
1000 SourceLocation *SelLocs = D->getStoredSelLocs();
1001 Record.push_back(NumStoredSelLocs);
1002 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1003 Record.AddSourceLocation(SelLocs[i]);
1004
1006}
1007
1010 Record.push_back(D->Variance);
1011 Record.push_back(D->Index);
1012 Record.AddSourceLocation(D->VarianceLoc);
1013 Record.AddSourceLocation(D->ColonLoc);
1014
1016}
1017
1019 static_assert(DeclContext::NumObjCContainerDeclBits == 64,
1020 "You need to update the serializer after you change the "
1021 "ObjCContainerDeclBits");
1022
1023 VisitNamedDecl(D);
1024 Record.AddSourceLocation(D->getAtStartLoc());
1025 Record.AddSourceRange(D->getAtEndRange());
1026 // Abstract class (no need to define a stable serialization::DECL code).
1027}
1028
1032 Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
1033 AddObjCTypeParamList(D->TypeParamList);
1034
1035 Record.push_back(D->isThisDeclarationADefinition());
1037 // Write the DefinitionData
1038 ObjCInterfaceDecl::DefinitionData &Data = D->data();
1039
1040 Record.AddTypeSourceInfo(D->getSuperClassTInfo());
1041 Record.AddSourceLocation(D->getEndOfDefinitionLoc());
1042 Record.push_back(Data.HasDesignatedInitializers);
1043 Record.push_back(D->getODRHash());
1044
1045 // Write out the protocols that are directly referenced by the @interface.
1046 Record.push_back(Data.ReferencedProtocols.size());
1047 for (const auto *P : D->protocols())
1048 Record.AddDeclRef(P);
1049 for (const auto &PL : D->protocol_locs())
1050 Record.AddSourceLocation(PL);
1051
1052 // Write out the protocols that are transitively referenced.
1053 Record.push_back(Data.AllReferencedProtocols.size());
1055 P = Data.AllReferencedProtocols.begin(),
1056 PEnd = Data.AllReferencedProtocols.end();
1057 P != PEnd; ++P)
1058 Record.AddDeclRef(*P);
1059
1060
1061 if (ObjCCategoryDecl *Cat = D->getCategoryListRaw()) {
1062 // Ensure that we write out the set of categories for this class.
1063 Writer.ObjCClassesWithCategories.insert(D);
1064
1065 // Make sure that the categories get serialized.
1066 for (; Cat; Cat = Cat->getNextClassCategoryRaw())
1067 (void)Writer.GetDeclRef(Cat);
1068 }
1069 }
1070
1072}
1073
1075 VisitFieldDecl(D);
1076 // FIXME: stable encoding for @public/@private/@protected/@package
1077 Record.push_back(D->getAccessControl());
1078 Record.push_back(D->getSynthesize());
1079
1080 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1081 !D->hasAttrs() &&
1082 !D->isImplicit() &&
1083 !D->isUsed(false) &&
1084 !D->isInvalidDecl() &&
1085 !D->isReferenced() &&
1086 !D->isModulePrivate() &&
1087 !D->getBitWidth() &&
1088 !D->hasExtInfo() &&
1089 D->getDeclName())
1090 AbbrevToUse = Writer.getDeclObjCIvarAbbrev();
1091
1093}
1094
1098
1099 Record.push_back(D->isThisDeclarationADefinition());
1101 Record.push_back(D->protocol_size());
1102 for (const auto *I : D->protocols())
1103 Record.AddDeclRef(I);
1104 for (const auto &PL : D->protocol_locs())
1105 Record.AddSourceLocation(PL);
1106 Record.push_back(D->getODRHash());
1107 }
1108
1110}
1111
1116
1119 Record.AddSourceLocation(D->getCategoryNameLoc());
1120 Record.AddSourceLocation(D->getIvarLBraceLoc());
1121 Record.AddSourceLocation(D->getIvarRBraceLoc());
1122 Record.AddDeclRef(D->getClassInterface());
1123 AddObjCTypeParamList(D->TypeParamList);
1124 Record.push_back(D->protocol_size());
1125 for (const auto *I : D->protocols())
1126 Record.AddDeclRef(I);
1127 for (const auto &PL : D->protocol_locs())
1128 Record.AddSourceLocation(PL);
1130}
1131
1137
1139 VisitNamedDecl(D);
1140 Record.AddSourceLocation(D->getAtLoc());
1141 Record.AddSourceLocation(D->getLParenLoc());
1142 Record.AddTypeRef(D->getType());
1143 Record.AddTypeSourceInfo(D->getTypeSourceInfo());
1144 // FIXME: stable encoding
1145 Record.push_back((unsigned)D->getPropertyAttributes());
1146 Record.push_back((unsigned)D->getPropertyAttributesAsWritten());
1147 // FIXME: stable encoding
1148 Record.push_back((unsigned)D->getPropertyImplementation());
1149 Record.AddDeclarationName(D->getGetterName());
1150 Record.AddSourceLocation(D->getGetterNameLoc());
1151 Record.AddDeclarationName(D->getSetterName());
1152 Record.AddSourceLocation(D->getSetterNameLoc());
1153 Record.AddDeclRef(D->getGetterMethodDecl());
1154 Record.AddDeclRef(D->getSetterMethodDecl());
1155 Record.AddDeclRef(D->getPropertyIvarDecl());
1157}
1158
1161 Record.AddDeclRef(D->getClassInterface());
1162 // Abstract class (no need to define a stable serialization::DECL code).
1163}
1164
1170
1173 Record.AddDeclRef(D->getSuperClass());
1174 Record.AddSourceLocation(D->getSuperClassLoc());
1175 Record.AddSourceLocation(D->getIvarLBraceLoc());
1176 Record.AddSourceLocation(D->getIvarRBraceLoc());
1177 Record.push_back(D->hasNonZeroConstructors());
1178 Record.push_back(D->hasDestructors());
1179 Record.push_back(D->NumIvarInitializers);
1180 if (D->NumIvarInitializers)
1181 Record.AddCXXCtorInitializers(
1182 llvm::ArrayRef(D->init_begin(), D->init_end()));
1184}
1185
1187 VisitDecl(D);
1188 Record.AddSourceLocation(D->getBeginLoc());
1189 Record.AddDeclRef(D->getPropertyDecl());
1190 Record.AddDeclRef(D->getPropertyIvarDecl());
1191 Record.AddSourceLocation(D->getPropertyIvarDeclLoc());
1192 Record.AddDeclRef(D->getGetterMethodDecl());
1193 Record.AddDeclRef(D->getSetterMethodDecl());
1194 Record.AddStmt(D->getGetterCXXConstructor());
1195 Record.AddStmt(D->getSetterCXXAssignment());
1197}
1198
1201 Record.push_back(D->isMutable());
1202
1203 Record.push_back((D->StorageKind << 1) | D->BitField);
1204 if (D->StorageKind == FieldDecl::ISK_CapturedVLAType)
1205 Record.AddTypeRef(QualType(D->getCapturedVLAType(), 0));
1206 else if (D->BitField)
1207 Record.AddStmt(D->getBitWidth());
1208
1209 if (!D->getDeclName() || D->isPlaceholderVar(Writer.getLangOpts()))
1210 Record.AddDeclRef(
1211 Record.getASTContext().getInstantiatedFromUnnamedFieldDecl(D));
1212
1213 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1214 !D->hasAttrs() &&
1215 !D->isImplicit() &&
1216 !D->isUsed(false) &&
1217 !D->isInvalidDecl() &&
1218 !D->isReferenced() &&
1220 !D->isModulePrivate() &&
1221 !D->getBitWidth() &&
1222 !D->hasInClassInitializer() &&
1223 !D->hasCapturedVLAType() &&
1224 !D->hasExtInfo() &&
1227 D->getDeclName())
1228 AbbrevToUse = Writer.getDeclFieldAbbrev();
1229
1231}
1232
1235 Record.AddIdentifierRef(D->getGetterId());
1236 Record.AddIdentifierRef(D->getSetterId());
1238}
1239
1241 VisitValueDecl(D);
1242 MSGuidDecl::Parts Parts = D->getParts();
1243 Record.push_back(Parts.Part1);
1244 Record.push_back(Parts.Part2);
1245 Record.push_back(Parts.Part3);
1246 Record.append(std::begin(Parts.Part4And5), std::end(Parts.Part4And5));
1248}
1249
1256
1262
1264 VisitValueDecl(D);
1265 Record.push_back(D->getChainingSize());
1266
1267 for (const auto *P : D->chain())
1268 Record.AddDeclRef(P);
1270}
1271
1275
1276 // The order matters here. It will be better to put the bit with higher
1277 // probability to be 0 in the end of the bits. See the comments in VisitDecl
1278 // for details.
1279 BitsPacker VarDeclBits;
1280 VarDeclBits.addBits(llvm::to_underlying(D->getLinkageInternal()),
1281 /*BitWidth=*/3);
1282
1283 bool ModulesCodegen = shouldVarGenerateHereOnly(D);
1284 VarDeclBits.addBit(ModulesCodegen);
1285
1286 VarDeclBits.addBits(D->getStorageClass(), /*BitWidth=*/3);
1287 VarDeclBits.addBits(D->getTSCSpec(), /*BitWidth=*/2);
1288 VarDeclBits.addBits(D->getInitStyle(), /*BitWidth=*/2);
1289 VarDeclBits.addBit(D->isARCPseudoStrong());
1290
1291 bool HasDeducedType = false;
1292 if (!isa<ParmVarDecl>(D)) {
1294 VarDeclBits.addBit(D->isExceptionVariable());
1295 VarDeclBits.addBit(D->isNRVOVariable());
1296 VarDeclBits.addBit(D->isCXXForRangeDecl());
1297
1298 VarDeclBits.addBit(D->isInline());
1299 VarDeclBits.addBit(D->isInlineSpecified());
1300 VarDeclBits.addBit(D->isConstexpr());
1301 VarDeclBits.addBit(D->isInitCapture());
1302 VarDeclBits.addBit(D->isPreviousDeclInSameBlockScope());
1303
1304 VarDeclBits.addBit(D->isEscapingByref());
1305 HasDeducedType = D->getType()->getContainedDeducedType();
1306 VarDeclBits.addBit(HasDeducedType);
1307
1308 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(D))
1309 VarDeclBits.addBits(llvm::to_underlying(IPD->getParameterKind()),
1310 /*Width=*/3);
1311 else
1312 VarDeclBits.addBits(0, /*Width=*/3);
1313
1314 VarDeclBits.addBit(D->isObjCForDecl());
1315 VarDeclBits.addBit(D->isCXXForRangeImplicitVar());
1316 }
1317
1318 Record.push_back(VarDeclBits);
1319
1320 if (ModulesCodegen)
1321 Writer.AddDeclRef(D, Writer.ModularCodegenDecls);
1322
1323 if (D->hasAttr<BlocksAttr>()) {
1324 BlockVarCopyInit Init = Record.getASTContext().getBlockVarCopyInit(D);
1325 Record.AddStmt(Init.getCopyExpr());
1326 if (Init.getCopyExpr())
1327 Record.push_back(Init.canThrow());
1328 }
1329
1330 enum {
1331 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1332 };
1333 if (VarTemplateDecl *TemplD = D->getDescribedVarTemplate()) {
1334 Record.push_back(VarTemplate);
1335 Record.AddDeclRef(TemplD);
1336 } else if (MemberSpecializationInfo *SpecInfo
1338 Record.push_back(StaticDataMemberSpecialization);
1339 Record.AddDeclRef(SpecInfo->getInstantiatedFrom());
1340 Record.push_back(SpecInfo->getTemplateSpecializationKind());
1341 Record.AddSourceLocation(SpecInfo->getPointOfInstantiation());
1342 } else {
1343 Record.push_back(VarNotTemplate);
1344 }
1345
1346 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
1350 !D->hasExtInfo() && D->getFirstDecl() == D->getMostRecentDecl() &&
1351 D->getKind() == Decl::Var && !D->isInline() && !D->isConstexpr() &&
1353 !D->hasInitWithSideEffects() && !D->isEscapingByref() &&
1354 !HasDeducedType && D->getStorageDuration() != SD_Static &&
1357 !D->isEscapingByref())
1358 AbbrevToUse = Writer.getDeclVarAbbrev();
1359
1361}
1362
1367
1369 VisitVarDecl(D);
1370
1371 // See the implementation of `ParmVarDecl::getParameterIndex()`, which may
1372 // exceed the size of the normal bitfield. So it may be better to not pack
1373 // these bits.
1374 Record.push_back(D->getFunctionScopeIndex());
1375
1376 BitsPacker ParmVarDeclBits;
1377 ParmVarDeclBits.addBit(D->isObjCMethodParameter());
1378 ParmVarDeclBits.addBits(D->getFunctionScopeDepth(), /*BitsWidth=*/7);
1379 // FIXME: stable encoding
1380 ParmVarDeclBits.addBits(D->getObjCDeclQualifier(), /*BitsWidth=*/7);
1381 ParmVarDeclBits.addBit(D->isKNRPromoted());
1382 ParmVarDeclBits.addBit(D->hasInheritedDefaultArg());
1383 ParmVarDeclBits.addBit(D->hasUninstantiatedDefaultArg());
1384 ParmVarDeclBits.addBit(D->getExplicitObjectParamThisLoc().isValid());
1385 Record.push_back(ParmVarDeclBits);
1386
1388 Record.AddStmt(D->getUninstantiatedDefaultArg());
1390 Record.AddSourceLocation(D->getExplicitObjectParamThisLoc());
1392
1393 // If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
1394 // we dynamically check for the properties that we optimize for, but don't
1395 // know are true of all PARM_VAR_DECLs.
1396 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
1397 !D->hasExtInfo() && D->getStorageClass() == 0 && !D->isInvalidDecl() &&
1399 D->getInitStyle() == VarDecl::CInit && // Can params have anything else?
1400 D->getInit() == nullptr) // No default expr.
1401 AbbrevToUse = Writer.getDeclParmVarAbbrev();
1402
1403 // Check things we know are true of *every* PARM_VAR_DECL, which is more than
1404 // just us assuming it.
1405 assert(!D->getTSCSpec() && "PARM_VAR_DECL can't use TLS");
1407 && "PARM_VAR_DECL can't be demoted definition.");
1408 assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
1409 assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
1410 assert(D->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl");
1411 assert(!D->isStaticDataMember() &&
1412 "PARM_VAR_DECL can't be static data member");
1413}
1414
1416 // Record the number of bindings first to simplify deserialization.
1417 Record.push_back(D->bindings().size());
1418
1419 VisitVarDecl(D);
1420 for (auto *B : D->bindings())
1421 Record.AddDeclRef(B);
1423}
1424
1426 VisitValueDecl(D);
1427 Record.AddStmt(D->getBinding());
1429}
1430
1432 VisitDecl(D);
1433 Record.AddStmt(D->getAsmStringExpr());
1434 Record.AddSourceLocation(D->getRParenLoc());
1436}
1437
1443
1448
1451 VisitDecl(D);
1452 Record.AddDeclRef(D->getExtendingDecl());
1453 Record.AddStmt(D->getTemporaryExpr());
1454 Record.push_back(static_cast<bool>(D->getValue()));
1455 if (D->getValue())
1456 Record.AddAPValue(*D->getValue());
1457 Record.push_back(D->getManglingNumber());
1459}
1461 VisitDecl(D);
1462 Record.AddStmt(D->getBody());
1463 Record.AddTypeSourceInfo(D->getSignatureAsWritten());
1464 Record.push_back(D->param_size());
1465 for (ParmVarDecl *P : D->parameters())
1466 Record.AddDeclRef(P);
1467 Record.push_back(D->isVariadic());
1468 Record.push_back(D->blockMissingReturnType());
1469 Record.push_back(D->isConversionFromLambda());
1470 Record.push_back(D->doesNotEscape());
1471 Record.push_back(D->canAvoidCopyToHeap());
1472 Record.push_back(D->capturesCXXThis());
1473 Record.push_back(D->getNumCaptures());
1474 for (const auto &capture : D->captures()) {
1475 Record.AddDeclRef(capture.getVariable());
1476
1477 unsigned flags = 0;
1478 if (capture.isByRef()) flags |= 1;
1479 if (capture.isNested()) flags |= 2;
1480 if (capture.hasCopyExpr()) flags |= 4;
1481 Record.push_back(flags);
1482
1483 if (capture.hasCopyExpr()) Record.AddStmt(capture.getCopyExpr());
1484 }
1485
1487}
1488
1490 Record.push_back(D->getNumParams());
1491 VisitDecl(D);
1492 for (unsigned I = 0; I < D->getNumParams(); ++I)
1493 Record.AddDeclRef(D->getParam(I));
1494 Record.push_back(D->isNothrow() ? 1 : 0);
1495 Record.AddStmt(D->getBody());
1497}
1498
1500 Record.push_back(CD->getNumParams());
1501 VisitDecl(CD);
1502 Record.push_back(CD->getContextParamPosition());
1503 Record.push_back(CD->isNothrow() ? 1 : 0);
1504 // Body is stored by VisitCapturedStmt.
1505 for (unsigned I = 0; I < CD->getNumParams(); ++I)
1506 Record.AddDeclRef(CD->getParam(I));
1508}
1509
1511 static_assert(DeclContext::NumLinkageSpecDeclBits == 17,
1512 "You need to update the serializer after you change the"
1513 "LinkageSpecDeclBits");
1514
1515 VisitDecl(D);
1516 Record.push_back(llvm::to_underlying(D->getLanguage()));
1517 Record.AddSourceLocation(D->getExternLoc());
1518 Record.AddSourceLocation(D->getRBraceLoc());
1520}
1521
1523 VisitDecl(D);
1524 Record.AddSourceLocation(D->getRBraceLoc());
1526}
1527
1529 VisitNamedDecl(D);
1530 Record.AddSourceLocation(D->getBeginLoc());
1532}
1533
1534
1537 VisitNamedDecl(D);
1538
1539 BitsPacker NamespaceDeclBits;
1540 NamespaceDeclBits.addBit(D->isInline());
1541 NamespaceDeclBits.addBit(D->isNested());
1542 Record.push_back(NamespaceDeclBits);
1543
1544 Record.AddSourceLocation(D->getBeginLoc());
1545 Record.AddSourceLocation(D->getRBraceLoc());
1546
1547 if (D->isFirstDecl())
1548 Record.AddDeclRef(D->getAnonymousNamespace());
1550
1551 if (Writer.hasChain() && D->isAnonymousNamespace() &&
1552 D == D->getMostRecentDecl()) {
1553 // This is a most recent reopening of the anonymous namespace. If its parent
1554 // is in a previous PCH (or is the TU), mark that parent for update, because
1555 // the original namespace always points to the latest re-opening of its
1556 // anonymous namespace.
1557 Decl *Parent = cast<Decl>(
1559 if (Parent->isFromASTFile() || isa<TranslationUnitDecl>(Parent)) {
1560 Writer.DeclUpdates[Parent].push_back(
1561 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, D));
1562 }
1563 }
1564}
1565
1568 VisitNamedDecl(D);
1569 Record.AddSourceLocation(D->getNamespaceLoc());
1570 Record.AddSourceLocation(D->getTargetNameLoc());
1571 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1572 Record.AddDeclRef(D->getNamespace());
1574}
1575
1577 VisitNamedDecl(D);
1578 Record.AddSourceLocation(D->getUsingLoc());
1579 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1580 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1581 Record.AddDeclRef(D->FirstUsingShadow.getPointer());
1582 Record.push_back(D->hasTypename());
1583 Record.AddDeclRef(Record.getASTContext().getInstantiatedFromUsingDecl(D));
1585}
1586
1588 VisitNamedDecl(D);
1589 Record.AddSourceLocation(D->getUsingLoc());
1590 Record.AddSourceLocation(D->getEnumLoc());
1591 Record.AddTypeSourceInfo(D->getEnumType());
1592 Record.AddDeclRef(D->FirstUsingShadow.getPointer());
1593 Record.AddDeclRef(Record.getASTContext().getInstantiatedFromUsingEnumDecl(D));
1595}
1596
1598 Record.push_back(D->NumExpansions);
1599 VisitNamedDecl(D);
1600 Record.AddDeclRef(D->getInstantiatedFromUsingDecl());
1601 for (auto *E : D->expansions())
1602 Record.AddDeclRef(E);
1604}
1605
1608 VisitNamedDecl(D);
1609 Record.AddDeclRef(D->getTargetDecl());
1610 Record.push_back(D->getIdentifierNamespace());
1611 Record.AddDeclRef(D->UsingOrNextShadow);
1612 Record.AddDeclRef(
1613 Record.getASTContext().getInstantiatedFromUsingShadowDecl(D));
1614
1615 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1616 D->getFirstDecl() == D->getMostRecentDecl() && !D->hasAttrs() &&
1619 AbbrevToUse = Writer.getDeclUsingShadowAbbrev();
1620
1622}
1623
1627 Record.AddDeclRef(D->NominatedBaseClassShadowDecl);
1628 Record.AddDeclRef(D->ConstructedBaseClassShadowDecl);
1629 Record.push_back(D->IsVirtual);
1631}
1632
1634 VisitNamedDecl(D);
1635 Record.AddSourceLocation(D->getUsingLoc());
1636 Record.AddSourceLocation(D->getNamespaceKeyLocation());
1637 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1638 Record.AddDeclRef(D->getNominatedNamespace());
1639 Record.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()));
1641}
1642
1644 VisitValueDecl(D);
1645 Record.AddSourceLocation(D->getUsingLoc());
1646 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1647 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1648 Record.AddSourceLocation(D->getEllipsisLoc());
1650}
1651
1654 VisitTypeDecl(D);
1655 Record.AddSourceLocation(D->getTypenameLoc());
1656 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1657 Record.AddSourceLocation(D->getEllipsisLoc());
1659}
1660
1666
1668 VisitRecordDecl(D);
1669
1670 enum {
1671 CXXRecNotTemplate = 0,
1672 CXXRecTemplate,
1673 CXXRecMemberSpecialization,
1674 CXXLambda
1675 };
1676 if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) {
1677 Record.push_back(CXXRecTemplate);
1678 Record.AddDeclRef(TemplD);
1679 } else if (MemberSpecializationInfo *MSInfo
1681 Record.push_back(CXXRecMemberSpecialization);
1682 Record.AddDeclRef(MSInfo->getInstantiatedFrom());
1683 Record.push_back(MSInfo->getTemplateSpecializationKind());
1684 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
1685 } else if (D->isLambda()) {
1686 // For a lambda, we need some information early for merging.
1687 Record.push_back(CXXLambda);
1688 if (auto *Context = D->getLambdaContextDecl()) {
1689 Record.AddDeclRef(Context);
1690 Record.push_back(D->getLambdaIndexInContext());
1691 } else {
1692 Record.push_back(0);
1693 }
1694 // For lambdas inside template functions, remember the mapping to
1695 // deserialize them together.
1696 if (auto *FD = llvm::dyn_cast_or_null<FunctionDecl>(D->getDeclContext());
1697 FD && isDefinitionInDependentContext(FD)) {
1698 Writer.RelatedDeclsMap[Writer.GetDeclRef(FD)].push_back(
1699 Writer.GetDeclRef(D->getLambdaCallOperator()));
1700 }
1701 } else {
1702 Record.push_back(CXXRecNotTemplate);
1703 }
1704
1705 Record.push_back(D->isThisDeclarationADefinition());
1707 Record.AddCXXDefinitionData(D);
1708
1709 if (D->isCompleteDefinition() && D->isInNamedModule())
1710 Writer.AddDeclRef(D, Writer.ModularCodegenDecls);
1711
1712 // Store (what we currently believe to be) the key function to avoid
1713 // deserializing every method so we can compute it.
1714 //
1715 // FIXME: Avoid adding the key function if the class is defined in
1716 // module purview since in that case the key function is meaningless.
1717 if (D->isCompleteDefinition())
1718 Record.AddDeclRef(Record.getASTContext().getCurrentKeyFunction(D));
1719
1721}
1722
1725 if (D->isCanonicalDecl()) {
1726 Record.push_back(D->size_overridden_methods());
1727 for (const CXXMethodDecl *MD : D->overridden_methods())
1728 Record.AddDeclRef(MD);
1729 } else {
1730 // We only need to record overridden methods once for the canonical decl.
1731 Record.push_back(0);
1732 }
1733
1734 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1735 D->getFirstDecl() == D->getMostRecentDecl() && !D->isInvalidDecl() &&
1736 !D->hasAttrs() && !D->isTopLevelDeclInObjCContainer() &&
1738 !D->hasExtInfo() && !D->isExplicitlyDefaulted()) {
1743 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1744 else if (D->getTemplatedKind() ==
1748
1749 if (FTSInfo->TemplateArguments->size() == 1) {
1750 const TemplateArgument &TA = FTSInfo->TemplateArguments->get(0);
1751 if (TA.getKind() == TemplateArgument::Type &&
1752 !FTSInfo->TemplateArgumentsAsWritten &&
1753 !FTSInfo->getMemberSpecializationInfo())
1754 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1755 }
1756 } else if (D->getTemplatedKind() ==
1760 if (!DFTSInfo->TemplateArgumentsAsWritten)
1761 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1762 }
1763 }
1764
1766}
1767
1769 static_assert(DeclContext::NumCXXConstructorDeclBits == 64,
1770 "You need to update the serializer after you change the "
1771 "CXXConstructorDeclBits");
1772
1773 Record.push_back(D->getTrailingAllocKind());
1774 addExplicitSpecifier(D->getExplicitSpecifierInternal(), Record);
1775 if (auto Inherited = D->getInheritedConstructor()) {
1776 Record.AddDeclRef(Inherited.getShadowDecl());
1777 Record.AddDeclRef(Inherited.getConstructor());
1778 }
1779
1780 ArrayRef<CXXDefaultArgExpr *> CtorClosureDefaultArgs =
1782 Record.push_back((unsigned)CtorClosureDefaultArgs.size());
1783 for (CXXDefaultArgExpr *Arg : CtorClosureDefaultArgs)
1784 Record.writeStmtRef(Arg);
1785
1788}
1789
1792
1793 Record.AddDeclRef(D->getOperatorDelete());
1794 if (D->getOperatorDelete())
1795 Record.AddStmt(D->getOperatorDeleteThisArg());
1796 Record.AddDeclRef(D->getOperatorGlobalDelete());
1797 Record.AddDeclRef(D->getArrayOperatorDelete());
1798 Record.AddDeclRef(D->getGlobalArrayOperatorDelete());
1799
1801}
1802
1808
1810 VisitDecl(D);
1811 Record.push_back(Writer.getSubmoduleID(D->getImportedModule()));
1812 ArrayRef<SourceLocation> IdentifierLocs = D->getIdentifierLocs();
1813 Record.push_back(!IdentifierLocs.empty());
1814 if (IdentifierLocs.empty()) {
1815 Record.AddSourceLocation(D->getEndLoc());
1816 Record.push_back(1);
1817 } else {
1818 for (unsigned I = 0, N = IdentifierLocs.size(); I != N; ++I)
1819 Record.AddSourceLocation(IdentifierLocs[I]);
1820 Record.push_back(IdentifierLocs.size());
1821 }
1822 // Note: the number of source locations must always be the last element in
1823 // the record.
1825}
1826
1828 VisitDecl(D);
1829 Record.AddSourceLocation(D->getColonLoc());
1831}
1832
1834 VisitDecl(D);
1835 bool hasFriendDecl = isa<NamedDecl *>(D->Friend);
1836 Record.push_back(hasFriendDecl);
1837 if (hasFriendDecl)
1838 Record.AddDeclRef(D->getFriendDecl());
1839 else
1840 Record.AddTypeSourceInfo(D->getFriendType());
1841 Record.AddDeclRef(D->getNextFriend());
1842 Record.AddSourceLocation(D->FriendLoc);
1843 Record.AddSourceLocation(D->EllipsisLoc);
1845}
1846
1848 // Record the number of template parameter lists here to simplify memory
1849 // allocation during deserialization.
1850 Record.push_back(D->NumTPLists);
1851 VisitDecl(D);
1853 Record.AddTemplateParameterList(TPL);
1855 if (D->getFriendType()) {
1856 Kind = D->Template.isNull() ? FTDK_Type : FTDK_Dependent;
1857 } else if (D->Template.isNull()) {
1858 assert(D->getFriendDecl());
1859 Kind = FTDK_Decl;
1860 } else {
1861 Kind = FTDK_Template;
1862 }
1863 Record.push_back(Kind);
1864 switch (Kind) {
1865 case FTDK_Type:
1866 Record.AddTypeSourceInfo(D->getFriendType());
1867 break;
1868 case FTDK_Dependent:
1869 Record.AddTypeSourceInfo(D->getFriendType());
1870 Record.AddTemplateName(D->Template);
1871 break;
1872 case FTDK_Decl:
1873 Record.AddDeclRef(D->getFriendDecl());
1874 break;
1875 case FTDK_Template:
1876 Record.AddTemplateName(D->Template);
1877 break;
1878 }
1879 Record.AddDeclRef(D->getNextFriend());
1880 Record.AddSourceLocation(D->FriendLoc);
1881 Record.AddSourceLocation(D->EllipsisLoc);
1883}
1884
1886 VisitNamedDecl(D);
1887
1888 Record.AddTemplateParameterList(D->getTemplateParameters());
1889 Record.AddDeclRef(D->getTemplatedDecl());
1890}
1891
1897
1900 Record.push_back(D->getTemplateArguments().size());
1901 VisitDecl(D);
1902 for (const TemplateArgument &Arg : D->getTemplateArguments())
1903 Record.AddTemplateArgument(Arg);
1905}
1906
1910
1913
1914 // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that
1915 // getCommonPtr() can be used while this is still initializing.
1916 if (D->isFirstDecl()) {
1917 // This declaration owns the 'common' pointer, so serialize that data now.
1918 Record.AddDeclRef(D->getInstantiatedFromMemberTemplate());
1920 Record.push_back(D->isMemberSpecialization());
1921 }
1922
1924 Record.push_back(D->getIdentifierNamespace());
1925}
1926
1929
1930 if (D->isFirstDecl())
1932
1933 // Force emitting the corresponding deduction guide in reduced BMI mode.
1934 // Otherwise, the deduction guide may be optimized out incorrectly.
1935 if (Writer.isGeneratingReducedBMI()) {
1936 auto Name =
1937 Record.getASTContext().DeclarationNames.getCXXDeductionGuideName(D);
1938 for (auto *DG : D->getDeclContext()->noload_lookup(Name))
1939 Writer.GetDeclRef(DG->getCanonicalDecl());
1940 }
1941
1943}
1944
1948
1950
1951 llvm::PointerUnion<ClassTemplateDecl *,
1954 if (Decl *InstFromD = InstFrom.dyn_cast<ClassTemplateDecl *>()) {
1955 Record.AddDeclRef(InstFromD);
1956 } else {
1957 Record.AddDeclRef(cast<ClassTemplatePartialSpecializationDecl *>(InstFrom));
1958 Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
1959 }
1960
1961 Record.AddTemplateArgumentList(&D->getTemplateArgs());
1962 Record.AddSourceLocation(D->getPointOfInstantiation());
1963 Record.push_back(D->getSpecializationKind());
1964 Record.push_back(D->hasStrictPackMatch());
1965 Record.push_back(D->isCanonicalDecl());
1966
1967 if (D->isCanonicalDecl()) {
1968 // When reading, we'll add it to the folding set of the following template.
1969 Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
1970 }
1971
1976 Record.push_back(ExplicitInstantiation);
1978 Record.AddSourceLocation(D->getExternKeywordLoc());
1979 Record.AddSourceLocation(D->getTemplateKeywordLoc());
1980 }
1981
1982 const ASTTemplateArgumentListInfo *ArgsWritten =
1984 Record.push_back(!!ArgsWritten);
1985 if (ArgsWritten)
1986 Record.AddASTTemplateArgumentListInfo(ArgsWritten);
1987
1988 // Mention the implicitly generated C++ deduction guide to make sure the
1989 // deduction guide will be rewritten as expected.
1990 //
1991 // FIXME: Would it be more efficient to add a callback register function
1992 // in sema to register the deduction guide?
1993 if (Writer.isWritingStdCXXNamedModules()) {
1994 auto Name =
1995 Record.getASTContext().DeclarationNames.getCXXDeductionGuideName(
1997 for (auto *DG : D->getDeclContext()->noload_lookup(Name))
1998 Writer.GetDeclRef(DG->getCanonicalDecl());
1999 }
2000
2001 // Ensure associated ExplicitInstantiationDecls survive reduced BMI.
2002 for (auto *EID : Record.getASTContext().getExplicitInstantiationDecls(D))
2003 Writer.GetDeclRef(EID);
2004
2006}
2007
2010 Record.AddTemplateParameterList(D->getTemplateParameters());
2011
2013
2014 // These are read/set from/to the first declaration.
2015 if (D->getPreviousDecl() == nullptr) {
2016 Record.AddDeclRef(D->getInstantiatedFromMember());
2017 Record.push_back(D->isMemberSpecialization());
2018 }
2019
2021}
2022
2030
2034
2035 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
2036 InstFrom = D->getSpecializedTemplateOrPartial();
2037 if (Decl *InstFromD = InstFrom.dyn_cast<VarTemplateDecl *>()) {
2038 Record.AddDeclRef(InstFromD);
2039 } else {
2040 Record.AddDeclRef(cast<VarTemplatePartialSpecializationDecl *>(InstFrom));
2041 Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
2042 }
2043
2048 Record.push_back(ExplicitInstantiation);
2050 Record.AddSourceLocation(D->getExternKeywordLoc());
2051 Record.AddSourceLocation(D->getTemplateKeywordLoc());
2052 }
2053
2054 const ASTTemplateArgumentListInfo *ArgsWritten =
2056 Record.push_back(!!ArgsWritten);
2057 if (ArgsWritten)
2058 Record.AddASTTemplateArgumentListInfo(ArgsWritten);
2059
2060 Record.AddTemplateArgumentList(&D->getTemplateArgs());
2061 Record.AddSourceLocation(D->getPointOfInstantiation());
2062 Record.push_back(D->getSpecializationKind());
2063 Record.push_back(D->IsCompleteDefinition);
2064
2065 VisitVarDecl(D);
2066
2067 Record.push_back(D->isCanonicalDecl());
2068
2069 if (D->isCanonicalDecl()) {
2070 // When reading, we'll add it to the folding set of the following template.
2071 Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
2072 }
2073
2074 // Ensure associated ExplicitInstantiationDecls survive reduced BMI.
2075 for (auto *EID : Record.getASTContext().getExplicitInstantiationDecls(D))
2076 Writer.GetDeclRef(EID);
2077
2079}
2080
2083 Record.AddTemplateParameterList(D->getTemplateParameters());
2084
2086
2087 // These are read/set from/to the first declaration.
2088 if (D->getPreviousDecl() == nullptr) {
2089 Record.AddDeclRef(D->getInstantiatedFromMember());
2090 Record.push_back(D->isMemberSpecialization());
2091 }
2092
2094}
2095
2103
2105 Record.push_back(D->hasTypeConstraint());
2106 VisitTypeDecl(D);
2107
2108 Record.push_back(D->wasDeclaredWithTypename());
2109
2110 const TypeConstraint *TC = D->getTypeConstraint();
2111 if (D->hasTypeConstraint())
2112 Record.push_back(/*TypeConstraintInitialized=*/TC != nullptr);
2113 if (TC) {
2114 auto *CR = TC->getConceptReference();
2115 Record.push_back(CR != nullptr);
2116 if (CR)
2117 Record.AddConceptReference(CR);
2118 Record.AddStmt(TC->getImmediatelyDeclaredConstraint());
2119 Record.writeUnsignedOrNone(TC->getArgPackSubstIndex());
2120 Record.writeUnsignedOrNone(D->getNumExpansionParameters());
2121 }
2122
2123 bool OwnsDefaultArg = D->hasDefaultArgument() &&
2125 Record.push_back(OwnsDefaultArg);
2126 if (OwnsDefaultArg)
2127 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2128
2129 if (!D->hasTypeConstraint() && !OwnsDefaultArg &&
2131 !D->isInvalidDecl() && !D->hasAttrs() &&
2134 AbbrevToUse = Writer.getDeclTemplateTypeParmAbbrev();
2135
2137}
2138
2140 // For an expanded parameter pack, record the number of expansion types here
2141 // so that it's easier for deserialization to allocate the right amount of
2142 // memory.
2143 Record.push_back(D->hasPlaceholderTypeConstraint());
2144 if (D->isExpandedParameterPack())
2145 Record.push_back(D->getNumExpansionTypes());
2146
2148 // TemplateParmPosition.
2149 Record.push_back(D->getDepth());
2150 Record.push_back(D->getPosition());
2151
2153 Record.AddStmt(D->getPlaceholderTypeConstraint());
2154
2155 if (D->isExpandedParameterPack()) {
2156 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2157 Record.AddTypeRef(D->getExpansionType(I));
2158 Record.AddTypeSourceInfo(D->getExpansionTypeSourceInfo(I));
2159 }
2160
2162 } else {
2163 // Rest of NonTypeTemplateParmDecl.
2164 Record.push_back(D->isParameterPack());
2165 bool OwnsDefaultArg = D->hasDefaultArgument() &&
2167 Record.push_back(OwnsDefaultArg);
2168 if (OwnsDefaultArg)
2169 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2171 }
2172}
2173
2175 // For an expanded parameter pack, record the number of expansion types here
2176 // so that it's easier for deserialization to allocate the right amount of
2177 // memory.
2178 if (D->isExpandedParameterPack())
2179 Record.push_back(D->getNumExpansionTemplateParameters());
2180
2182 Record.push_back(D->templateParameterKind());
2183 Record.push_back(D->wasDeclaredWithTypename());
2184 // TemplateParmPosition.
2185 Record.push_back(D->getDepth());
2186 Record.push_back(D->getPosition());
2187
2188 if (D->isExpandedParameterPack()) {
2189 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2190 I != N; ++I)
2191 Record.AddTemplateParameterList(D->getExpansionTemplateParameters(I));
2193 } else {
2194 // Rest of TemplateTemplateParmDecl.
2195 Record.push_back(D->isParameterPack());
2196 bool OwnsDefaultArg = D->hasDefaultArgument() &&
2198 Record.push_back(OwnsDefaultArg);
2199 if (OwnsDefaultArg)
2200 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2202 }
2203}
2204
2209
2211 VisitDecl(D);
2212 Record.AddStmt(D->getAssertExpr());
2213 Record.push_back(D->isFailed());
2214 Record.AddStmt(D->getMessage());
2215 Record.AddSourceLocation(D->getRParenLoc());
2217}
2218
2221 // Trailing-object flags must be the first thing written so the reader can
2222 // allocate the right amount of trailing storage in CreateDeserialized.
2223 unsigned Flags = 0;
2224 if (D->hasTrailingQualifier())
2225 Flags |= ExplicitInstantiationDecl::HasQualifierFlag;
2226 if (D->hasTrailingArgsAsWritten())
2227 Flags |= ExplicitInstantiationDecl::HasArgsAsWrittenFlag;
2228 Record.push_back(Flags);
2229
2230 VisitDecl(D);
2231 Record.AddDeclRef(D->getSpecialization());
2232 Record.AddSourceLocation(D->getExternLoc());
2233 Record.AddSourceLocation(D->getNameLoc());
2234 Record.AddTypeSourceInfo(D->getRawTypeSourceInfo());
2235 Record.push_back(D->getTemplateSpecializationKind());
2236 // Trailing objects.
2237 if (D->hasTrailingQualifier())
2238 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
2239 if (const auto *Args = D->getTrailingArgsInfo())
2240 Record.AddASTTemplateArgumentListInfo(Args);
2242}
2243
2245 VisitDecl(D);
2246 Record.AddStmt(D->getExpansionPattern());
2247 Record.AddStmt(D->getInstantiations());
2248 Record.AddDeclRef(D->getIndexTemplateParm());
2250}
2251
2252/// Emit the DeclContext part of a declaration context decl.
2254 static_assert(DeclContext::NumDeclContextBits == 13,
2255 "You need to update the serializer after you change the "
2256 "DeclContextBits");
2257 LookupBlockOffsets Offsets;
2258
2259 if (Writer.isGeneratingReducedBMI() && isa<NamespaceDecl>(DC) &&
2260 cast<NamespaceDecl>(DC)->isFromExplicitGlobalModule()) {
2261 // In reduced BMI, delay writing lexical and visible block for namespace
2262 // in the global module fragment. See the comments of DelayedNamespace for
2263 // details.
2264 Writer.DelayedNamespace.push_back(cast<NamespaceDecl>(DC));
2265 } else {
2266 Offsets.LexicalOffset =
2267 Writer.WriteDeclContextLexicalBlock(Record.getASTContext(), DC);
2268 Writer.WriteDeclContextVisibleBlock(Record.getASTContext(), DC, Offsets);
2269 }
2270
2271 Record.AddLookupOffsets(Offsets);
2272}
2273
2275 assert(IsLocalDecl(D) && "expected a local declaration");
2276
2277 const Decl *Canon = D->getCanonicalDecl();
2278 if (IsLocalDecl(Canon))
2279 return Canon;
2280
2281 const Decl *&CacheEntry = FirstLocalDeclCache[Canon];
2282 if (CacheEntry)
2283 return CacheEntry;
2284
2285 for (const Decl *Redecl = D; Redecl; Redecl = Redecl->getPreviousDecl())
2286 if (IsLocalDecl(Redecl))
2287 D = Redecl;
2288 return CacheEntry = D;
2289}
2290
2291template <typename T>
2293 T *First = D->getFirstDecl();
2294 T *MostRecent = First->getMostRecentDecl();
2295 T *DAsT = static_cast<T *>(D);
2296 if (MostRecent != First) {
2297 assert(isRedeclarableDeclKind(DAsT->getKind()) &&
2298 "Not considered redeclarable?");
2299
2300 Record.AddDeclRef(First);
2301
2302 // Write out a list of local redeclarations of this declaration if it's the
2303 // first local declaration in the chain.
2304 const Decl *FirstLocal = Writer.getFirstLocalDecl(DAsT);
2305 if (DAsT == FirstLocal) {
2306 // Emit a list of all imported first declarations so that we can be sure
2307 // that all redeclarations visible to this module are before D in the
2308 // redecl chain.
2309 unsigned I = Record.size();
2310 Record.push_back(0);
2311 if (Writer.Chain)
2312 AddFirstDeclFromEachModule(DAsT, /*IncludeLocal*/false);
2313 // This is the number of imported first declarations + 1.
2314 Record[I] = Record.size() - I;
2315
2316 // Collect the set of local redeclarations of this declaration, from
2317 // newest to oldest.
2318 ASTWriter::RecordData LocalRedecls;
2319 ASTRecordWriter LocalRedeclWriter(Record, LocalRedecls);
2320 for (const Decl *Prev = FirstLocal->getMostRecentDecl();
2321 Prev != FirstLocal; Prev = Prev->getPreviousDecl())
2322 if (!Prev->isFromASTFile())
2323 LocalRedeclWriter.AddDeclRef(Prev);
2324
2325 // If we have any redecls, write them now as a separate record preceding
2326 // the declaration itself.
2327 if (LocalRedecls.empty())
2328 Record.push_back(0);
2329 else
2330 Record.AddOffset(LocalRedeclWriter.Emit(LOCAL_REDECLARATIONS));
2331 } else {
2332 Record.push_back(0);
2333 Record.AddDeclRef(FirstLocal);
2334 }
2335
2336 // Make sure that we serialize both the previous and the most-recent
2337 // declarations, which (transitively) ensures that all declarations in the
2338 // chain get serialized.
2339 //
2340 // FIXME: This is not correct; when we reach an imported declaration we
2341 // won't emit its previous declaration.
2342 (void)Writer.GetDeclRef(D->getPreviousDecl());
2343 (void)Writer.GetDeclRef(MostRecent);
2344 } else {
2345 // We use the sentinel value 0 to indicate an only declaration.
2346 Record.push_back(0);
2347 }
2348}
2349
2351 VisitNamedDecl(D);
2353 Record.push_back(D->isCBuffer());
2354 Record.AddSourceLocation(D->getLocStart());
2355 Record.AddSourceLocation(D->getLBraceLoc());
2356 Record.AddSourceLocation(D->getRBraceLoc());
2357
2359}
2360
2362 Record.writeOMPChildren(D->Data);
2363 VisitDecl(D);
2365}
2366
2368 Record.writeOMPChildren(D->Data);
2369 VisitDecl(D);
2371}
2372
2374 Record.writeOMPChildren(D->Data);
2375 VisitDecl(D);
2377}
2378
2381 "You need to update the serializer after you change the "
2382 "NumOMPDeclareReductionDeclBits");
2383
2384 VisitValueDecl(D);
2385 Record.AddSourceLocation(D->getBeginLoc());
2386 Record.AddStmt(D->getCombinerIn());
2387 Record.AddStmt(D->getCombinerOut());
2388 Record.AddStmt(D->getCombiner());
2389 Record.AddStmt(D->getInitOrig());
2390 Record.AddStmt(D->getInitPriv());
2391 Record.AddStmt(D->getInitializer());
2392 Record.push_back(llvm::to_underlying(D->getInitializerKind()));
2393 Record.AddDeclRef(D->getPrevDeclInScope());
2395}
2396
2398 Record.writeOMPChildren(D->Data);
2399 VisitValueDecl(D);
2400 Record.AddDeclarationName(D->getVarName());
2401 Record.AddDeclRef(D->getPrevDeclInScope());
2403}
2404
2409
2411 Record.writeUInt32(D->clauses().size());
2412 VisitDecl(D);
2413 Record.writeEnum(D->DirKind);
2414 Record.AddSourceLocation(D->DirectiveLoc);
2415 Record.AddSourceLocation(D->EndLoc);
2416 Record.writeOpenACCClauseList(D->clauses());
2418}
2420 Record.writeUInt32(D->clauses().size());
2421 VisitDecl(D);
2422 Record.writeEnum(D->DirKind);
2423 Record.AddSourceLocation(D->DirectiveLoc);
2424 Record.AddSourceLocation(D->EndLoc);
2425 Record.AddSourceRange(D->ParensLoc);
2426 Record.AddStmt(D->FuncRef);
2427 Record.writeOpenACCClauseList(D->clauses());
2429}
2430
2431//===----------------------------------------------------------------------===//
2432// ASTWriter Implementation
2433//===----------------------------------------------------------------------===//
2434
2435namespace {
2436template <FunctionDecl::TemplatedKind Kind>
2437std::shared_ptr<llvm::BitCodeAbbrev>
2438getFunctionDeclAbbrev(serialization::DeclCode Code) {
2439 using namespace llvm;
2440
2441 auto Abv = std::make_shared<BitCodeAbbrev>();
2442 Abv->Add(BitCodeAbbrevOp(Code));
2443 // RedeclarableDecl
2444 Abv->Add(BitCodeAbbrevOp(0)); // CanonicalDecl
2445 Abv->Add(BitCodeAbbrevOp(Kind));
2446 if constexpr (Kind == FunctionDecl::TK_NonTemplate) {
2447
2448 } else if constexpr (Kind == FunctionDecl::TK_FunctionTemplate) {
2449 // DescribedFunctionTemplate
2450 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2451 } else if constexpr (Kind == FunctionDecl::TK_DependentNonTemplate) {
2452 // Instantiated From Decl
2453 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2454 } else if constexpr (Kind == FunctionDecl::TK_MemberSpecialization) {
2455 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InstantiatedFrom
2456 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2457 3)); // TemplateSpecializationKind
2458 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Specialized Location
2459 } else if constexpr (Kind ==
2461 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Template
2462 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2463 3)); // TemplateSpecializationKind
2464 Abv->Add(BitCodeAbbrevOp(1)); // Template Argument Size
2465 Abv->Add(BitCodeAbbrevOp(TemplateArgument::Type)); // Template Argument Kind
2466 Abv->Add(
2467 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Template Argument Type
2468 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Is Defaulted
2469 Abv->Add(BitCodeAbbrevOp(0)); // TemplateArgumentsAsWritten
2470 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
2471 Abv->Add(BitCodeAbbrevOp(0));
2472 Abv->Add(
2473 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Canonical Decl of template
2474 } else if constexpr (Kind == FunctionDecl::
2475 TK_DependentFunctionTemplateSpecialization) {
2476 // Candidates of specialization
2477 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2478 Abv->Add(BitCodeAbbrevOp(0)); // TemplateArgumentsAsWritten
2479 } else {
2480 llvm_unreachable("Unknown templated kind?");
2481 }
2482 // Decl
2483 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2484 8)); // Packed DeclBits: ModuleOwnershipKind,
2485 // isUsed, isReferenced, AccessSpecifier,
2486 // isImplicit
2487 //
2488 // The following bits should be 0:
2489 // HasStandaloneLexicalDC, HasAttrs,
2490 // TopLevelDeclInObjCContainer,
2491 // isInvalidDecl
2492 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2493 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2494 // NamedDecl
2495 Abv->Add(BitCodeAbbrevOp(DeclarationName::Identifier)); // NameKind
2496 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Identifier
2497 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2498 // ValueDecl
2499 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2500 // DeclaratorDecl
2501 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerLocStart
2502 Abv->Add(BitCodeAbbrevOp(0)); // HasExtInfo
2503 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
2504 // FunctionDecl
2505 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS
2506 Abv->Add(BitCodeAbbrevOp(
2507 BitCodeAbbrevOp::Fixed,
2508 28)); // Packed Function Bits: StorageClass, Inline, InlineSpecified,
2509 // VirtualAsWritten, Pure, HasInheritedProto, HasWrittenProto,
2510 // Deleted, Trivial, TrivialForCall, Defaulted, ExplicitlyDefaulted,
2511 // IsIneligibleOrNotSelected, ImplicitReturnZero, Constexpr,
2512 // UsesSEHTry, SkippedBody, MultiVersion, LateParsed,
2513 // FriendConstraintRefersToEnclosingTemplate, Linkage,
2514 // ShouldSkipCheckingODR
2515 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LocEnd
2516 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // ODRHash
2517 // This Array slurps the rest of the record. Fortunately we want to encode
2518 // (nearly) all the remaining (variable number of) fields in the same way.
2519 //
2520 // This is:
2521 // NumParams and Params[] from FunctionDecl, and
2522 // NumOverriddenMethods, OverriddenMethods[] from CXXMethodDecl.
2523 //
2524 // Add an AbbrevOp for 'size then elements' and use it here.
2525 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2526 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2527 return Abv;
2528}
2529
2530template <FunctionDecl::TemplatedKind Kind>
2531std::shared_ptr<llvm::BitCodeAbbrev> getCXXMethodAbbrev() {
2532 return getFunctionDeclAbbrev<Kind>(serialization::DECL_CXX_METHOD);
2533}
2534} // namespace
2535
2536void ASTWriter::WriteDeclAbbrevs() {
2537 using namespace llvm;
2538
2539 std::shared_ptr<BitCodeAbbrev> Abv;
2540
2541 // Abbreviation for DECL_FIELD
2542 Abv = std::make_shared<BitCodeAbbrev>();
2543 Abv->Add(BitCodeAbbrevOp(serialization::DECL_FIELD));
2544 // Decl
2545 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2546 7)); // Packed DeclBits: ModuleOwnershipKind,
2547 // isUsed, isReferenced, AccessSpecifier,
2548 //
2549 // The following bits should be 0:
2550 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2551 // TopLevelDeclInObjCContainer,
2552 // isInvalidDecl
2553 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2554 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2555 // NamedDecl
2556 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2557 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2558 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2559 // ValueDecl
2560 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2561 // DeclaratorDecl
2562 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
2563 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2564 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
2565 // FieldDecl
2566 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
2567 Abv->Add(BitCodeAbbrevOp(0)); // StorageKind
2568 // Type Source Info
2569 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2570 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
2571 DeclFieldAbbrev = Stream.EmitAbbrev(std::move(Abv));
2572
2573 // Abbreviation for DECL_OBJC_IVAR
2574 Abv = std::make_shared<BitCodeAbbrev>();
2575 Abv->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR));
2576 // Decl
2577 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2578 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2579 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2580 // isReferenced, TopLevelDeclInObjCContainer,
2581 // AccessSpecifier, ModuleOwnershipKind
2582 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2583 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2584 // NamedDecl
2585 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2586 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2587 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2588 // ValueDecl
2589 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2590 // DeclaratorDecl
2591 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
2592 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2593 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
2594 // FieldDecl
2595 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
2596 Abv->Add(BitCodeAbbrevOp(0)); // InitStyle
2597 // ObjC Ivar
2598 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl
2599 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize
2600 // Type Source Info
2601 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2602 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
2603 DeclObjCIvarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2604
2605 // Abbreviation for DECL_ENUM
2606 Abv = std::make_shared<BitCodeAbbrev>();
2607 Abv->Add(BitCodeAbbrevOp(serialization::DECL_ENUM));
2608 // Redeclarable
2609 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2610 // Decl
2611 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2612 7)); // Packed DeclBits: ModuleOwnershipKind,
2613 // isUsed, isReferenced, AccessSpecifier,
2614 //
2615 // The following bits should be 0:
2616 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2617 // TopLevelDeclInObjCContainer,
2618 // isInvalidDecl
2619 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2620 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2621 // NamedDecl
2622 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2623 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2624 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2625 // TypeDecl
2626 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2627 // TagDecl
2628 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace
2629 Abv->Add(BitCodeAbbrevOp(
2630 BitCodeAbbrevOp::Fixed,
2631 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
2632 // EmbeddedInDeclarator, IsFreeStanding,
2633 // isCompleteDefinitionRequired, ExtInfoKind
2634 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
2635 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
2636 // EnumDecl
2637 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddTypeRef
2638 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IntegerType
2639 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getPromotionType
2640 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 20)); // Enum Decl Bits
2641 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));// ODRHash
2642 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InstantiatedMembEnum
2643 // DC
2644 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset
2645 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset
2646 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ModuleLocalOffset
2647 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TULocalOffset
2648 DeclEnumAbbrev = Stream.EmitAbbrev(std::move(Abv));
2649
2650 // Abbreviation for DECL_RECORD
2651 Abv = std::make_shared<BitCodeAbbrev>();
2652 Abv->Add(BitCodeAbbrevOp(serialization::DECL_RECORD));
2653 // Redeclarable
2654 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2655 // Decl
2656 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2657 7)); // Packed DeclBits: ModuleOwnershipKind,
2658 // isUsed, isReferenced, AccessSpecifier,
2659 //
2660 // The following bits should be 0:
2661 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2662 // TopLevelDeclInObjCContainer,
2663 // isInvalidDecl
2664 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2665 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2666 // NamedDecl
2667 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2668 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2669 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2670 // TypeDecl
2671 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2672 // TagDecl
2673 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace
2674 Abv->Add(BitCodeAbbrevOp(
2675 BitCodeAbbrevOp::Fixed,
2676 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
2677 // EmbeddedInDeclarator, IsFreeStanding,
2678 // isCompleteDefinitionRequired, ExtInfoKind
2679 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
2680 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
2681 // RecordDecl
2682 Abv->Add(BitCodeAbbrevOp(
2683 BitCodeAbbrevOp::Fixed,
2684 14)); // Packed Record Decl Bits: FlexibleArrayMember,
2685 // AnonymousStructUnion, hasObjectMember, hasVolatileMember,
2686 // isNonTrivialToPrimitiveDefaultInitialize,
2687 // isNonTrivialToPrimitiveCopy, isNonTrivialToPrimitiveDestroy,
2688 // hasNonTrivialToPrimitiveDefaultInitializeCUnion,
2689 // hasNonTrivialToPrimitiveDestructCUnion,
2690 // hasNonTrivialToPrimitiveCopyCUnion,
2691 // hasUninitializedExplicitInitFields, isParamDestroyedInCallee,
2692 // getArgPassingRestrictions
2693 // ODRHash
2694 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 26));
2695
2696 // DC
2697 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset
2698 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset
2699 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ModuleLocalOffset
2700 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TULocalOffset
2701 DeclRecordAbbrev = Stream.EmitAbbrev(std::move(Abv));
2702
2703 // Abbreviation for DECL_PARM_VAR
2704 Abv = std::make_shared<BitCodeAbbrev>();
2705 Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR));
2706 // Redeclarable
2707 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2708 // Decl
2709 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2710 8)); // Packed DeclBits: ModuleOwnershipKind, isUsed,
2711 // isReferenced, AccessSpecifier,
2712 // HasStandaloneLexicalDC, HasAttrs, isImplicit,
2713 // TopLevelDeclInObjCContainer,
2714 // isInvalidDecl,
2715 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2716 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2717 // NamedDecl
2718 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2719 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2720 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2721 // ValueDecl
2722 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2723 // DeclaratorDecl
2724 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
2725 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2726 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
2727 // VarDecl
2728 Abv->Add(
2729 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2730 12)); // Packed Var Decl bits: SClass, TSCSpec, InitStyle,
2731 // isARCPseudoStrong, Linkage, ModulesCodegen
2732 Abv->Add(BitCodeAbbrevOp(0)); // VarKind (local enum)
2733 // ParmVarDecl
2734 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ScopeIndex
2735 Abv->Add(BitCodeAbbrevOp(
2736 BitCodeAbbrevOp::Fixed,
2737 19)); // Packed Parm Var Decl bits: IsObjCMethodParameter, ScopeDepth,
2738 // ObjCDeclQualifier, KNRPromoted,
2739 // HasInheritedDefaultArg, HasUninstantiatedDefaultArg
2740 // Type Source Info
2741 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2742 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
2743 DeclParmVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2744
2745 // Abbreviation for DECL_TYPEDEF
2746 Abv = std::make_shared<BitCodeAbbrev>();
2747 Abv->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF));
2748 // Redeclarable
2749 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2750 // Decl
2751 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2752 7)); // Packed DeclBits: ModuleOwnershipKind,
2753 // isReferenced, isUsed, AccessSpecifier. Other
2754 // higher bits should be 0: isImplicit,
2755 // HasStandaloneLexicalDC, HasAttrs,
2756 // TopLevelDeclInObjCContainer, isInvalidDecl
2757 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2758 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2759 // NamedDecl
2760 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2761 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2762 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2763 // TypeDecl
2764 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2765 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
2766 // TypedefDecl
2767 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2768 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
2769 DeclTypedefAbbrev = Stream.EmitAbbrev(std::move(Abv));
2770
2771 // Abbreviation for DECL_VAR
2772 Abv = std::make_shared<BitCodeAbbrev>();
2773 Abv->Add(BitCodeAbbrevOp(serialization::DECL_VAR));
2774 // Redeclarable
2775 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2776 // Decl
2777 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2778 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2779 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2780 // isReferenced, TopLevelDeclInObjCContainer,
2781 // AccessSpecifier, ModuleOwnershipKind
2782 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2783 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2784 // NamedDecl
2785 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2786 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2787 Abv->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2788 // ValueDecl
2789 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2790 // DeclaratorDecl
2791 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
2792 Abv->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2793 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TSIType
2794 // VarDecl
2795 Abv->Add(BitCodeAbbrevOp(
2796 BitCodeAbbrevOp::Fixed,
2797 22)); // Packed Var Decl bits: Linkage, ModulesCodegen,
2798 // SClass, TSCSpec, InitStyle,
2799 // isARCPseudoStrong, IsThisDeclarationADemotedDefinition,
2800 // isExceptionVariable, isNRVOVariable, isCXXForRangeDecl,
2801 // isInline, isInlineSpecified, isConstexpr,
2802 // isInitCapture, isPrevDeclInSameScope, hasInitWithSideEffects,
2803 // EscapingByref, HasDeducedType, ImplicitParamKind, isObjCForDecl
2804 // IsCXXForRangeImplicitVar
2805 Abv->Add(BitCodeAbbrevOp(0)); // VarKind (local enum)
2806 // Type Source Info
2807 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2808 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
2809 DeclVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2810
2811 // Abbreviation for DECL_CXX_METHOD
2812 DeclCXXMethodAbbrev =
2813 Stream.EmitAbbrev(getCXXMethodAbbrev<FunctionDecl::TK_NonTemplate>());
2814 DeclTemplateCXXMethodAbbrev = Stream.EmitAbbrev(
2815 getCXXMethodAbbrev<FunctionDecl::TK_FunctionTemplate>());
2816 DeclDependentNonTemplateCXXMethodAbbrev = Stream.EmitAbbrev(
2817 getCXXMethodAbbrev<FunctionDecl::TK_DependentNonTemplate>());
2818 DeclMemberSpecializedCXXMethodAbbrev = Stream.EmitAbbrev(
2819 getCXXMethodAbbrev<FunctionDecl::TK_MemberSpecialization>());
2820 DeclTemplateSpecializedCXXMethodAbbrev = Stream.EmitAbbrev(
2821 getCXXMethodAbbrev<FunctionDecl::TK_FunctionTemplateSpecialization>());
2822 DeclDependentSpecializationCXXMethodAbbrev = Stream.EmitAbbrev(
2823 getCXXMethodAbbrev<
2825
2826 // Abbreviation for DECL_TEMPLATE_TYPE_PARM
2827 Abv = std::make_shared<BitCodeAbbrev>();
2828 Abv->Add(BitCodeAbbrevOp(serialization::DECL_TEMPLATE_TYPE_PARM));
2829 Abv->Add(BitCodeAbbrevOp(0)); // hasTypeConstraint
2830 // Decl
2831 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2832 7)); // Packed DeclBits: ModuleOwnershipKind,
2833 // isReferenced, isUsed, AccessSpecifier. Other
2834 // higher bits should be 0: isImplicit,
2835 // HasStandaloneLexicalDC, HasAttrs,
2836 // TopLevelDeclInObjCContainer, isInvalidDecl
2837 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2838 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2839 // NamedDecl
2840 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2841 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2842 Abv->Add(BitCodeAbbrevOp(0));
2843 // TypeDecl
2844 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2845 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
2846 // TemplateTypeParmDecl
2847 Abv->Add(
2848 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // wasDeclaredWithTypename
2849 Abv->Add(BitCodeAbbrevOp(0)); // OwnsDefaultArg
2850 DeclTemplateTypeParmAbbrev = Stream.EmitAbbrev(std::move(Abv));
2851
2852 // Abbreviation for DECL_USING_SHADOW
2853 Abv = std::make_shared<BitCodeAbbrev>();
2854 Abv->Add(BitCodeAbbrevOp(serialization::DECL_USING_SHADOW));
2855 // Redeclarable
2856 Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
2857 // Decl
2858 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2859 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2860 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2861 // isReferenced, TopLevelDeclInObjCContainer,
2862 // AccessSpecifier, ModuleOwnershipKind
2863 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
2864 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
2865 // NamedDecl
2866 Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2867 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
2868 Abv->Add(BitCodeAbbrevOp(0));
2869 // UsingShadowDecl
2870 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TargetDecl
2871 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS
2872 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // UsingOrNextShadow
2873 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR,
2874 6)); // InstantiatedFromUsingShadowDecl
2875 DeclUsingShadowAbbrev = Stream.EmitAbbrev(std::move(Abv));
2876
2877 // Abbreviation for EXPR_DECL_REF
2878 Abv = std::make_shared<BitCodeAbbrev>();
2879 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF));
2880 // Stmt
2881 // Expr
2882 // PackingBits: DependenceKind, ValueKind. ObjectKind should be 0.
2883 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
2884 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2885 // DeclRefExpr
2886 // Packing Bits: , HadMultipleCandidates, RefersToEnclosingVariableOrCapture,
2887 // IsImmediateEscalating, NonOdrUseReason.
2888 // GetDeclFound, HasQualifier and ExplicitTemplateArgs should be 0.
2889 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2890 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclRef
2891 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2892 DeclRefExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2893
2894 // Abbreviation for EXPR_INTEGER_LITERAL
2895 Abv = std::make_shared<BitCodeAbbrev>();
2896 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_INTEGER_LITERAL));
2897 //Stmt
2898 // Expr
2899 // DependenceKind, ValueKind, ObjectKind
2900 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2901 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2902 // Integer Literal
2903 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2904 Abv->Add(BitCodeAbbrevOp(32)); // Bit Width
2905 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Value
2906 IntegerLiteralAbbrev = Stream.EmitAbbrev(std::move(Abv));
2907
2908 // Abbreviation for EXPR_CHARACTER_LITERAL
2909 Abv = std::make_shared<BitCodeAbbrev>();
2910 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CHARACTER_LITERAL));
2911 //Stmt
2912 // Expr
2913 // DependenceKind, ValueKind, ObjectKind
2914 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2915 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2916 // Character Literal
2917 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getValue
2918 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2919 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // getKind
2920 CharacterLiteralAbbrev = Stream.EmitAbbrev(std::move(Abv));
2921
2922 // Abbreviation for EXPR_IMPLICIT_CAST
2923 Abv = std::make_shared<BitCodeAbbrev>();
2924 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_IMPLICIT_CAST));
2925 // Stmt
2926 // Expr
2927 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2928 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2929 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2930 // CastExpr
2931 Abv->Add(BitCodeAbbrevOp(0)); // PathSize
2932 // Packing Bits: CastKind, StoredFPFeatures, isPartOfExplicitCast
2933 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 9));
2934 // ImplicitCastExpr
2935 ExprImplicitCastAbbrev = Stream.EmitAbbrev(std::move(Abv));
2936
2937 // Abbreviation for EXPR_BINARY_OPERATOR
2938 Abv = std::make_shared<BitCodeAbbrev>();
2939 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_BINARY_OPERATOR));
2940 // Stmt
2941 // Expr
2942 // Packing Bits: DependenceKind. ValueKind and ObjectKind should
2943 // be 0 in this case.
2944 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2945 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2946 // BinaryOperator
2947 Abv->Add(
2948 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpCode and HasFPFeatures
2949 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2950 BinaryOperatorAbbrev = Stream.EmitAbbrev(std::move(Abv));
2951
2952 // Abbreviation for EXPR_COMPOUND_ASSIGN_OPERATOR
2953 Abv = std::make_shared<BitCodeAbbrev>();
2954 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_COMPOUND_ASSIGN_OPERATOR));
2955 // Stmt
2956 // Expr
2957 // Packing Bits: DependenceKind. ValueKind and ObjectKind should
2958 // be 0 in this case.
2959 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2960 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2961 // BinaryOperator
2962 // Packing Bits: OpCode. The HasFPFeatures bit should be 0
2963 Abv->Add(
2964 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpCode and HasFPFeatures
2965 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2966 // CompoundAssignOperator
2967 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHSType
2968 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Result Type
2969 CompoundAssignOperatorAbbrev = Stream.EmitAbbrev(std::move(Abv));
2970
2971 // Abbreviation for EXPR_CALL
2972 Abv = std::make_shared<BitCodeAbbrev>();
2973 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CALL));
2974 // Stmt
2975 // Expr
2976 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2977 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2978 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2979 // CallExpr
2980 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumArgs
2981 Abv->Add(BitCodeAbbrevOp(0)); // ADLCallKind
2982 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2983 CallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2984
2985 // Abbreviation for EXPR_CXX_OPERATOR_CALL
2986 Abv = std::make_shared<BitCodeAbbrev>();
2987 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CXX_OPERATOR_CALL));
2988 // Stmt
2989 // Expr
2990 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2991 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2992 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2993 // CallExpr
2994 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumArgs
2995 Abv->Add(BitCodeAbbrevOp(0)); // ADLCallKind
2996 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
2997 // CXXOperatorCallExpr
2998 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Operator Kind
2999 Abv->Add(BitCodeAbbrevOp(0)); // IsReversed
3000 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
3001 CXXOperatorCallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
3002
3003 // Abbreviation for EXPR_CXX_MEMBER_CALL
3004 Abv = std::make_shared<BitCodeAbbrev>();
3005 Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CXX_MEMBER_CALL));
3006 // Stmt
3007 // Expr
3008 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
3009 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
3010 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
3011 // CallExpr
3012 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // NumArgs
3013 Abv->Add(BitCodeAbbrevOp(0)); // ADLCallKind
3014 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
3015 // CXXMemberCallExpr
3016 CXXMemberCallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
3017
3018 // Abbreviation for STMT_COMPOUND
3019 Abv = std::make_shared<BitCodeAbbrev>();
3020 Abv->Add(BitCodeAbbrevOp(serialization::STMT_COMPOUND));
3021 // Stmt
3022 // CompoundStmt
3023 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Num Stmts
3024 Abv->Add(BitCodeAbbrevOp(0)); // hasStoredFPFeatures
3025 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
3026 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
3027 CompoundStmtAbbrev = Stream.EmitAbbrev(std::move(Abv));
3028
3029 Abv = std::make_shared<BitCodeAbbrev>();
3030 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_LEXICAL));
3031 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3032 DeclContextLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
3033
3034 Abv = std::make_shared<BitCodeAbbrev>();
3035 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_VISIBLE));
3036 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3037 DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
3038
3039 Abv = std::make_shared<BitCodeAbbrev>();
3040 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_MODULE_LOCAL_VISIBLE));
3041 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3042 DeclModuleLocalVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
3043
3044 Abv = std::make_shared<BitCodeAbbrev>();
3045 Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_TU_LOCAL_VISIBLE));
3046 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3047 DeclTULocalLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
3048
3049 Abv = std::make_shared<BitCodeAbbrev>();
3050 Abv->Add(BitCodeAbbrevOp(serialization::DECL_SPECIALIZATIONS));
3051 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3052 DeclSpecializationsAbbrev = Stream.EmitAbbrev(std::move(Abv));
3053
3054 Abv = std::make_shared<BitCodeAbbrev>();
3055 Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARTIAL_SPECIALIZATIONS));
3056 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3057 DeclPartialSpecializationsAbbrev = Stream.EmitAbbrev(std::move(Abv));
3058}
3059
3060/// isRequiredDecl - Check if this is a "required" Decl, which must be seen by
3061/// consumers of the AST.
3062///
3063/// Such decls will always be deserialized from the AST file, so we would like
3064/// this to be as restrictive as possible. Currently the predicate is driven by
3065/// code generation requirements, if other clients have a different notion of
3066/// what is "required" then we may have to consider an alternate scheme where
3067/// clients can iterate over the top-level decls and get information on them,
3068/// without necessary deserializing them. We could explicitly require such
3069/// clients to use a separate API call to "realize" the decl. This should be
3070/// relatively painless since they would presumably only do it for top-level
3071/// decls.
3072static bool isRequiredDecl(const Decl *D, ASTContext &Context,
3073 Module *WritingModule) {
3074 // Named modules have different semantics than header modules. Every named
3075 // module units owns a translation unit. So the importer of named modules
3076 // doesn't need to deserilize everything ahead of time.
3077 if (WritingModule && WritingModule->isNamedModule()) {
3078 // The PragmaCommentDecl and PragmaDetectMismatchDecl are MSVC's extension.
3079 // And the behavior of MSVC for such cases will leak this to the module
3080 // users. Given pragma is not a standard thing, the compiler has the space
3081 // to do their own decision. Let's follow MSVC here.
3083 return true;
3084 return false;
3085 }
3086
3087 // An ObjCMethodDecl is never considered as "required" because its
3088 // implementation container always is.
3089
3090 // File scoped assembly or obj-c or OMP declare target implementation must be
3091 // seen.
3093 return true;
3094
3095 if (WritingModule && isPartOfPerModuleInitializer(D)) {
3096 // These declarations are part of the module initializer, and are emitted
3097 // if and when the module is imported, rather than being emitted eagerly.
3098 return false;
3099 }
3100
3101 return Context.DeclMustBeEmitted(D);
3102}
3103
3104void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) {
3105 PrettyDeclStackTraceEntry CrashInfo(Context, D, SourceLocation(),
3106 "serializing");
3107
3108 // Determine the ID for this declaration.
3109 LocalDeclID ID;
3110 assert(!D->isFromASTFile() && "should not be emitting imported decl");
3111 LocalDeclID &IDR = DeclIDs[D];
3112 if (IDR.isInvalid())
3113 IDR = NextDeclID++;
3114
3115 ID = IDR;
3116
3117 assert(ID >= FirstDeclID && "invalid decl ID");
3118
3120 ASTDeclWriter W(*this, Context, Record, GeneratingReducedBMI);
3121
3122 // Build a record for this declaration
3123 W.Visit(D);
3124
3125 // Emit this declaration to the bitstream.
3126 uint64_t Offset = W.Emit(D);
3127
3128 // Record the offset for this declaration
3129 SourceLocation Loc = D->getLocation();
3131 getRawSourceLocationEncoding(getAdjustedLocation(Loc));
3132
3133 unsigned Index = ID.getRawValue() - FirstDeclID.getRawValue();
3134 if (DeclOffsets.size() == Index)
3135 DeclOffsets.emplace_back(RawLoc, Offset, DeclTypesBlockStartOffset);
3136 else if (DeclOffsets.size() < Index) {
3137 // FIXME: Can/should this happen?
3138 DeclOffsets.resize(Index+1);
3139 DeclOffsets[Index].setRawLoc(RawLoc);
3140 DeclOffsets[Index].setBitOffset(Offset, DeclTypesBlockStartOffset);
3141 } else {
3142 llvm_unreachable("declarations should be emitted in ID order");
3143 }
3144
3145 SourceManager &SM = Context.getSourceManager();
3146 if (Loc.isValid() && SM.isLocalSourceLocation(Loc))
3147 associateDeclWithFile(D, ID);
3148
3149 // Note declarations that should be deserialized eagerly so that we can add
3150 // them to a record in the AST file later.
3151 if (isRequiredDecl(D, Context, WritingModule))
3152 AddDeclRef(D, EagerlyDeserializedDecls);
3153}
3154
3156 // Switch case IDs are per function body.
3157 Writer->ClearSwitchCaseIDs();
3158
3159 assert(FD->doesThisDeclarationHaveABody());
3160 bool ModulesCodegen = shouldFunctionGenerateHereOnly(FD);
3161 Record->push_back(ModulesCodegen);
3162 if (ModulesCodegen)
3163 Writer->AddDeclRef(FD, Writer->ModularCodegenDecls);
3164 if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
3165 Record->push_back(CD->getNumCtorInitializers());
3166 if (CD->getNumCtorInitializers())
3167 AddCXXCtorInitializers(llvm::ArrayRef(CD->init_begin(), CD->init_end()));
3168 }
3169 AddStmt(FD->getBody());
3170}
static void addExplicitSpecifier(ExplicitSpecifier ES, ASTRecordWriter &Record)
static bool shouldVarGenerateHereOnly(const VarDecl *VD)
static bool shouldFunctionGenerateHereOnly(const FunctionDecl *FD)
static bool isRequiredDecl(const Decl *D, ASTContext &Context, Module *WritingModule)
isRequiredDecl - Check if this is a "required" Decl, which must be seen by consumers of the AST.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
llvm::MachO::Record Record
Definition MachO.h:31
This file defines OpenMP AST classes for clauses.
Defines the SourceManager interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
SourceManager & getSourceManager()
Definition ASTContext.h:885
const LangOptions & getLangOpts() const
Definition ASTContext.h:981
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const
MutableArrayRef< FunctionTemplateSpecializationInfo > getPartialSpecializations(FunctionTemplateDecl::Common *)
void VisitBindingDecl(BindingDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
void VisitNamedDecl(NamedDecl *D)
RedeclarableTemplateDecl::SpecEntryTraits< EntryType >::DeclType * getSpecializationDecl(EntryType &T)
Get the specialization decl from an entry in the specialization list.
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D)
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitExportDecl(ExportDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
void VisitParmVarDecl(ParmVarDecl *D)
void VisitRedeclarable(Redeclarable< T > *D)
void VisitFriendDecl(FriendDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *D)
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitConceptDecl(ConceptDecl *D)
void AddFirstSpecializationDeclFromEachModule(const Decl *D, llvm::SmallVectorImpl< const Decl * > &SpecsInMap, llvm::SmallVectorImpl< const Decl * > &PartialSpecsInMap)
Add to the record the first template specialization from each module file that provides a declaration...
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitBlockDecl(BlockDecl *D)
void VisitLabelDecl(LabelDecl *LD)
void VisitTemplateDecl(TemplateDecl *D)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitFieldDecl(FieldDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void RegisterTemplateSpecialization(const Decl *Template, const Decl *Specialization)
Ensure that this template specialization is associated with the specified template on reload.
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitValueDecl(ValueDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *D)
decltype(T::PartialSpecializations) & getPartialSpecializations(T *Common)
Get the list of partial specializations from a template's common ptr.
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
ASTDeclWriter(ASTWriter &Writer, ASTContext &Context, ASTWriter::RecordDataImpl &Record, bool GeneratingReducedBMI)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitMSPropertyDecl(MSPropertyDecl *D)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitTypeDecl(TypeDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitCapturedDecl(CapturedDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void VisitTypedefDecl(TypedefDecl *D)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitTypedefNameDecl(TypedefNameDecl *D)
void VisitCXXExpansionStmtDecl(CXXExpansionStmtDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitUsingDecl(UsingDecl *D)
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void AddTemplateSpecializations(DeclTy *D)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
bool shouldSkipWritingSpecializations(T *Spec)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
uint64_t Emit(Decl *D)
void VisitVarTemplateDecl(VarTemplateDecl *D)
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarDecl(VarDecl *D)
void VisitImportDecl(ImportDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *D)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitFunctionDecl(FunctionDecl *D)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitEnumDecl(EnumDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitDeclContext(DeclContext *DC)
Emit the DeclContext part of a declaration context decl.
void AddObjCTypeParamList(ObjCTypeParamList *typeParams)
Add an Objective-C type parameter list to the given record.
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
void VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void AddFirstDeclFromEachModule(const Decl *D, bool IncludeLocal)
Add to the record the first declaration from each module file that provides a declaration of D.
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitDecompositionDecl(DecompositionDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitTagDecl(TagDecl *D)
void VisitTypeAliasDecl(TypeAliasDecl *D)
void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
An object for streaming information to a record.
void AddFunctionDefinition(const FunctionDecl *FD)
Add a definition for the given function to the queue of statements to emit.
uint64_t Emit(unsigned Code, unsigned Abbrev=0)
Emit the record to the stream, followed by its substatements, and return its offset.
void AddStmt(Stmt *S)
Add the given statement or expression to the queue of statements to emit.
void AddCXXCtorInitializers(ArrayRef< CXXCtorInitializer * > CtorInits)
Emit a CXXCtorInitializer array.
void AddDeclRef(const Decl *D)
Emit a reference to a declaration.
Writes an AST file containing the contents of a translation unit.
Definition ASTWriter.h:97
bool IsLocalDecl(const Decl *D) const
Is this a local declaration (that is, one that will be written to our AST file)?
Definition ASTWriter.h:785
SmallVectorImpl< uint64_t > RecordDataImpl
Definition ASTWriter.h:103
SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc)
Return the raw encodings for source locations.
friend class ASTDeclWriter
Definition ASTWriter.h:99
const Decl * getFirstLocalDecl(const Decl *D)
Find the first local declaration of a given local redeclarable decl.
SmallVector< uint64_t, 64 > RecordData
Definition ASTWriter.h:102
void AddDeclRef(const Decl *D, RecordDataImpl &Record)
Emit a reference to a declaration.
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
Definition DeclCXX.h:108
A binding in a decomposition declaration.
Definition DeclCXX.h:4210
Expr * getBinding() const
Get the expression to which this declaration is bound.
Definition DeclCXX.h:4236
A simple helper class to pack several bits in order into (a) 32 bit integer(s).
Definition ASTWriter.h:1086
void addBit(bool Value)
Definition ASTWriter.h:1106
void addBits(uint32_t Value, uint32_t BitsWidth)
Definition ASTWriter.h:1107
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4806
unsigned getNumCaptures() const
Returns the number of captured variables.
Definition Decl.h:4929
bool canAvoidCopyToHeap() const
Definition Decl.h:4960
size_t param_size() const
Definition Decl.h:4908
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition Decl.h:4885
ArrayRef< Capture > captures() const
Definition Decl.h:4933
bool blockMissingReturnType() const
Definition Decl.h:4941
bool capturesCXXThis() const
Definition Decl.h:4938
bool doesNotEscape() const
Definition Decl.h:4957
bool isConversionFromLambda() const
Definition Decl.h:4949
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:4892
bool isVariadic() const
Definition Decl.h:4881
TypeSourceInfo * getSignatureAsWritten() const
Definition Decl.h:4889
Represents a C++ constructor within a class.
Definition DeclCXX.h:2637
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
Definition DeclCXX.h:2872
ArrayRef< CXXDefaultArgExpr * > getCtorClosureDefaultArgs() const
Definition DeclCXX.cpp:3139
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2972
ExplicitSpecifier getExplicitSpecifier() const
Definition DeclCXX.h:2999
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1996
ExplicitSpecifier getExplicitSpecifier() const
Definition DeclCXX.h:2054
const CXXDeductionGuideDecl * getSourceDeductionGuide() const
Get the deduction guide from which this deduction guide was generated, if it was generated as part of...
Definition DeclCXX.h:2071
DeductionCandidate getDeductionCandidateKind() const
Definition DeclCXX.h:2091
SourceDeductionGuideKind getSourceDeductionGuideKind() const
Definition DeclCXX.h:2079
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1274
Represents a C++ destructor within a class.
Definition DeclCXX.h:2902
const FunctionDecl * getOperatorGlobalDelete() const
Definition DeclCXX.cpp:3235
const FunctionDecl * getGlobalArrayOperatorDelete() const
Definition DeclCXX.cpp:3245
const FunctionDecl * getOperatorDelete() const
Definition DeclCXX.cpp:3230
Expr * getOperatorDeleteThisArg() const
Definition DeclCXX.h:2941
const FunctionDecl * getArrayOperatorDelete() const
Definition DeclCXX.cpp:3240
Represents a C++26 expansion statement declaration.
CXXExpansionStmtPattern * getExpansionPattern()
CXXExpansionStmtInstantiation * getInstantiations()
NonTypeTemplateParmDecl * getIndexTemplateParm()
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2145
CXXMethodDecl * getMostRecentDecl()
Definition DeclCXX.h:2265
overridden_method_range overridden_methods() const
Definition DeclCXX.cpp:2828
unsigned size_overridden_methods() const
Definition DeclCXX.cpp:2822
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
Definition DeclCXX.cpp:1836
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
Definition DeclCXX.h:1812
bool isLambda() const
Determine whether this class describes a lambda function object.
Definition DeclCXX.h:1023
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
Definition DeclCXX.cpp:2062
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
Definition DeclCXX.cpp:2054
static bool classofKind(Kind K)
Definition DeclCXX.h:1936
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
Definition DeclCXX.cpp:2039
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition DeclCXX.cpp:1744
CXXRecordDecl * getPreviousDecl()
Definition DeclCXX.h:530
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:5078
unsigned getNumParams() const
Definition Decl.h:5116
unsigned getContextParamPosition() const
Definition Decl.h:5145
bool isNothrow() const
Definition Decl.cpp:5770
ImplicitParamDecl * getParam(unsigned i) const
Definition Decl.h:5118
Declaration of a class template.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
bool isMemberSpecialization() const
Determines whether this class template partial specialization template was a specialization of a memb...
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
Declaration of a C++20 concept.
Expr * getConstraintExpr() const
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3702
A POD class for pairing a NamedDecl* with an access specifier.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2126
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
Definition DeclBase.h:2142
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isInvalid() const
Definition DeclID.h:126
A simple visitor class that helps create declaration visitors.
Definition DeclVisitor.h:68
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h:1078
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition DeclBase.h:1093
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclBase.h:443
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1243
bool hasAttrs() const
Definition DeclBase.h:526
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
bool isInNamedModule() const
Whether this declaration comes from a named module.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
Definition Decl.cpp:100
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
Definition DeclBase.h:893
bool isReferenced() const
Whether any declaration of this entity was referenced.
Definition DeclBase.cpp:604
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:1001
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
bool isInvalidDecl() const
Definition DeclBase.h:596
unsigned getIdentifierNamespace() const
Definition DeclBase.h:906
SourceLocation getLocation() const
Definition DeclBase.h:447
const char * getDeclKindName() const
Definition DeclBase.cpp:169
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition DeclBase.h:629
bool isTopLevelDeclInObjCContainer() const
Whether this declaration is a top-level declaration (function, global variable, etc....
Definition DeclBase.h:642
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:579
DeclContext * getDeclContext()
Definition DeclBase.h:456
AccessSpecifier getAccess() const
Definition DeclBase.h:515
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclBase.h:439
AttrVec & getAttrs()
Definition DeclBase.h:532
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:935
bool hasAttr() const
Definition DeclBase.h:585
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
Kind getKind() const
Definition DeclBase.h:450
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
Definition Decl.h:822
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
A decomposition declaration.
Definition DeclCXX.h:4274
ArrayRef< BindingDecl * > bindings() const
Definition DeclCXX.h:4314
Provides information about a dependent function-template specialization declaration.
ArrayRef< FunctionTemplateDecl * > getCandidates() const
Returns the candidates for the primary function template.
const ASTTemplateArgumentListInfo * TemplateArgumentsAsWritten
The template arguments as written in the sources, if provided.
Represents an empty-declaration.
Definition Decl.h:5313
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3557
llvm::APSInt getInitVal() const
Definition Decl.h:3577
const Expr * getInitExpr() const
Definition Decl.h:3575
Represents an enum.
Definition Decl.h:4145
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4417
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4363
unsigned getNumNegativeBits() const
Returns the width in bits required to store all the negative enumerators of this enum.
Definition Decl.h:4355
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4366
unsigned getODRHash()
Definition Decl.cpp:5231
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
Definition Decl.h:4334
EnumDecl * getMostRecentDecl()
Definition Decl.h:4250
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition Decl.h:4372
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4318
unsigned getNumPositiveBits() const
Returns the width in bits required to store all the non-negative enumerators of this enum.
Definition Decl.h:4344
QualType getPromotionType() const
Return the integer type that enumerators should promote to.
Definition Decl.h:4310
Represents an explicit instantiation of a template entity in source code.
TemplateSpecializationKind getTemplateSpecializationKind() const
SourceLocation getExternLoc() const
NamedDecl * getSpecialization() const
NestedNameSpecifierLoc getQualifierLoc() const
Returns the qualifier regardless of where it is stored.
SourceLocation getNameLoc() const
Store information needed for an explicit specifier.
Definition DeclCXX.h:1944
ExplicitSpecKind getKind() const
Definition DeclCXX.h:1952
const Expr * getExpr() const
Definition DeclCXX.h:1953
Represents a standard C++ module export declaration.
Definition Decl.h:5266
SourceLocation getRBraceLoc() const
Definition Decl.h:5285
This represents one expression.
Definition Expr.h:113
Represents a member of a struct/union/class.
Definition Decl.h:3294
bool isMutable() const
Determines whether this field is mutable (C++ only).
Definition Decl.h:3394
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3474
bool hasCapturedVLAType() const
Determine whether this member captures the variable length array type.
Definition Decl.h:3513
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
Definition Decl.h:3410
const VariableArrayType * getCapturedVLAType() const
Get the captured variable length array type.
Definition Decl.h:3518
const Expr * getAsmStringExpr() const
Definition Decl.h:4754
SourceLocation getRParenLoc() const
Definition Decl.h:4748
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:46
FriendUnion Friend
Definition DeclFriend.h:63
virtual NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
Definition DeclFriend.h:102
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Definition DeclFriend.h:96
FriendDecl * getNextFriend()
Definition DeclFriend.h:74
Declaration of a friend template.
NamedDecl * getFriendDecl() const override
If this friend declaration doesn't name a type, return the inner declaration.
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
Represents a function declaration or definition.
Definition Decl.h:2058
bool isMultiVersion() const
True if this function is considered a multiversioned function.
Definition Decl.h:2819
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3268
bool isTrivialForCall() const
Definition Decl.h:2506
ConstexprSpecKind getConstexprKind() const
Definition Decl.h:2602
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
Definition Decl.cpp:3183
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4237
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3595
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:3051
SourceLocation getDefaultLoc() const
Definition Decl.h:2524
bool usesSEHTry() const
Indicates the function uses __try.
Definition Decl.h:2644
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2904
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition Decl.h:2515
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2503
bool hasWrittenPrototype() const
Whether this function has a written prototype.
Definition Decl.h:2574
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4216
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4367
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition Decl.h:2439
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
Definition Decl.cpp:4433
unsigned getODRHash()
Returns ODRHash of the function.
Definition Decl.cpp:4743
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2074
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2077
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:3018
bool FriendConstraintRefersToEnclosingTemplate() const
Definition Decl.h:2837
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4188
bool isDeletedAsWritten() const
Definition Decl.h:2670
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition Decl.h:2479
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
Definition Decl.h:2483
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
Definition Decl.h:2554
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
Definition Decl.h:2809
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Definition Decl.cpp:3603
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2511
bool isIneligibleOrNotSelected() const
Definition Decl.h:2544
FunctionDecl * getInstantiatedFromDecl() const
Definition Decl.cpp:4261
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition Decl.h:2470
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
Definition Decl.h:2585
size_t param_size() const
Definition Decl.h:2920
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition Decl.h:3029
bool isInstantiatedFromMemberTemplate() const
Definition Decl.h:2492
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
MemberSpecializationInfo * getMemberSpecializationInfo() const
Get the specialization info if this function template specialization is also a member specialization:
const ASTTemplateArgumentListInfo * TemplateArgumentsAsWritten
The template arguments as written in the sources, if provided.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this function template specialization.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5328
bool isCBuffer() const
Definition Decl.h:5372
SourceLocation getLBraceLoc() const
Definition Decl.h:5369
SourceLocation getLocStart() const LLVM_READONLY
Definition Decl.h:5368
SourceLocation getRBraceLoc() const
Definition Decl.h:5370
ArrayRef< TemplateArgument > getTemplateArguments() const
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5187
ArrayRef< SourceLocation > getIdentifierLocs() const
Retrieves the locations of each of the identifiers that make up the complete module name in the impor...
Definition Decl.cpp:6139
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition Decl.h:5245
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3601
unsigned getChainingSize() const
Definition Decl.h:3626
ArrayRef< NamedDecl * > chain() const
Definition Decl.h:3622
Represents the declaration of a label.
Definition Decl.h:524
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3333
Expr * getTemporaryExpr()
Retrieve the expression to which the temporary materialization conversion was applied.
Definition DeclCXX.h:3379
Represents a linkage specification.
Definition DeclCXX.h:3040
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Definition DeclCXX.h:3063
SourceLocation getExternLoc() const
Definition DeclCXX.h:3079
SourceLocation getRBraceLoc() const
Definition DeclCXX.h:3080
A global _GUID constant.
Definition DeclCXX.h:4428
Parts getParts() const
Get the decomposed parts of this declaration.
Definition DeclCXX.h:4458
MSGuidDeclParts Parts
Definition DeclCXX.h:4430
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4374
IdentifierInfo * getGetterId() const
Definition DeclCXX.h:4396
IdentifierInfo * getSetterId() const
Definition DeclCXX.h:4398
Provides information a specialization of a member of a class template, which may be a member function...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
NamedDecl * getInstantiatedFrom() const
Retrieve the member declaration from which this member was instantiated.
Describes a module or submodule.
Definition Module.h:340
bool isInterfaceOrPartition() const
Definition Module.h:889
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Definition Module.h:423
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition Module.h:940
This represents a decl that may have a name.
Definition Decl.h:274
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Definition DeclBase.h:656
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
Definition Decl.cpp:1183
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1096
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
Represents a C++ namespace alias.
Definition DeclCXX.h:3226
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Definition DeclCXX.h:3287
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
Definition DeclCXX.h:3312
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
Definition DeclCXX.h:3315
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Definition DeclCXX.h:3296
Represent a C++ namespace.
Definition Decl.h:592
SourceLocation getRBraceLoc() const
Definition Decl.h:692
NamespaceDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:691
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Definition Decl.h:643
bool isInline() const
Returns true if this is an inline namespace declaration.
Definition Decl.h:648
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
Definition Decl.h:675
bool isNested() const
Returns true if this is a nested namespace declaration.
Definition Decl.h:657
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
QualType getExpansionType(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
TypeSourceInfo * getExpansionTypeSourceInfo(unsigned I) const
Retrieve a particular expansion type source info within an expanded parameter pack.
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Expr * getPlaceholderTypeConstraint() const
Return the constraint introduced by the placeholder type of this non-type template parameter (if any)...
This represents 'pragma omp allocate ...' directive.
Definition DeclOpenMP.h:536
Pseudo declaration for capturing expressions.
Definition DeclOpenMP.h:445
OMPChildren * Data
Data, associated with the directive.
Definition DeclOpenMP.h:43
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
Definition DeclOpenMP.h:421
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Definition DeclOpenMP.h:300
Expr * getInitPriv()
Get Priv variable of the initializer.
Definition DeclOpenMP.h:311
Expr * getCombinerOut()
Get Out variable of the combiner.
Definition DeclOpenMP.h:288
Expr * getCombinerIn()
Get In variable of the combiner.
Definition DeclOpenMP.h:285
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
Definition DeclOpenMP.h:282
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Expr * getInitOrig()
Get Orig variable of the initializer.
Definition DeclOpenMP.h:308
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
Definition DeclOpenMP.h:303
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
This represents 'pragma omp threadprivate ...' directive.
Definition DeclOpenMP.h:110
Represents a field declaration created by an @defs(...).
Definition DeclObjC.h:2036
static bool classofKind(Kind K)
Definition DeclObjC.h:2057
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2335
protocol_loc_range protocol_locs() const
Definition DeclObjC.h:2423
unsigned protocol_size() const
Definition DeclObjC.h:2418
ObjCInterfaceDecl * getClassInterface()
Definition DeclObjC.h:2378
SourceLocation getIvarLBraceLoc() const
Definition DeclObjC.h:2470
SourceLocation getIvarRBraceLoc() const
Definition DeclObjC.h:2472
protocol_range protocols() const
Definition DeclObjC.h:2409
SourceLocation getCategoryNameLoc() const
Definition DeclObjC.h:2466
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2551
SourceLocation getCategoryNameLoc() const
Definition DeclObjC.h:2578
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition DeclObjC.h:2781
const ObjCInterfaceDecl * getClassInterface() const
Definition DeclObjC.h:2799
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:954
SourceRange getAtEndRange() const
Definition DeclObjC.h:1109
SourceLocation getAtStartLoc() const
Definition DeclObjC.h:1102
const ObjCInterfaceDecl * getClassInterface() const
Definition DeclObjC.h:2492
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2603
init_iterator init_end()
init_end() - Retrieve an iterator past the last initializer.
Definition DeclObjC.h:2684
SourceLocation getIvarRBraceLoc() const
Definition DeclObjC.h:2750
bool hasNonZeroConstructors() const
Do any of the ivars of this class (not counting its base classes) require construction other than zer...
Definition DeclObjC.h:2708
SourceLocation getSuperClassLoc() const
Definition DeclObjC.h:2743
bool hasDestructors() const
Do any of the ivars of this class (not counting its base classes) require non-trivial destruction?
Definition DeclObjC.h:2713
init_iterator init_begin()
init_begin() - Retrieve an iterator to the first initializer.
Definition DeclObjC.h:2675
const ObjCInterfaceDecl * getSuperClass() const
Definition DeclObjC.h:2741
SourceLocation getIvarLBraceLoc() const
Definition DeclObjC.h:2748
Represents an ObjC class declaration.
Definition DeclObjC.h:1160
protocol_range protocols() const
Definition DeclObjC.h:1365
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition DeclObjC.cpp:788
protocol_loc_range protocol_locs() const
Definition DeclObjC.h:1394
ObjCCategoryDecl * getCategoryListRaw() const
Retrieve the raw pointer to the start of the category/extension list.
Definition DeclObjC.h:1791
bool isThisDeclarationADefinition() const
Determine whether this particular declaration of this class is actually also a definition.
Definition DeclObjC.h:1529
const Type * getTypeForDecl() const
Definition DeclObjC.h:1925
SourceLocation getEndOfDefinitionLoc() const
Definition DeclObjC.h:1884
TypeSourceInfo * getSuperClassTInfo() const
Definition DeclObjC.h:1579
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1958
AccessControl getAccessControl() const
Definition DeclObjC.h:2006
bool getSynthesize() const
Definition DeclObjC.h:2013
static bool classofKind(Kind K)
Definition DeclObjC.h:2021
T *const * iterator
Definition DeclObjC.h:88
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
ImplicitParamDecl * getSelfDecl() const
Definition DeclObjC.h:421
bool isOverriding() const
Whether this method overrides any other in the class hierarchy.
Definition DeclObjC.h:465
ObjCDeclQualifier getObjCDeclQualifier() const
Definition DeclObjC.h:246
ArrayRef< ParmVarDecl * > parameters() const
Definition DeclObjC.h:376
unsigned param_size() const
Definition DeclObjC.h:350
bool isPropertyAccessor() const
Definition DeclObjC.h:439
bool isVariadic() const
Definition DeclObjC.h:434
Stmt * getBody() const override
Retrieve the body of this method, if it has one.
Definition DeclObjC.cpp:927
SourceLocation getEndLoc() const LLVM_READONLY
TypeSourceInfo * getReturnTypeSourceInfo() const
Definition DeclObjC.h:346
bool hasRedeclaration() const
True if redeclared in the same interface.
Definition DeclObjC.h:274
bool isSynthesizedAccessorStub() const
Definition DeclObjC.h:447
bool hasRelatedResultType() const
Determine whether this method has a result type that is related to the message receiver's type.
Definition DeclObjC.h:259
bool isRedeclaration() const
True if this is a method redeclaration in the same interface.
Definition DeclObjC.h:269
ImplicitParamDecl * getCmdDecl() const
Definition DeclObjC.h:423
bool isInstanceMethod() const
Definition DeclObjC.h:429
bool isDefined() const
Definition DeclObjC.h:455
QualType getReturnType() const
Definition DeclObjC.h:332
ObjCImplementationControl getImplementationControl() const
Definition DeclObjC.h:503
bool hasSkippedBody() const
True if the method was a definition but its body was skipped.
Definition DeclObjC.h:480
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:734
SourceLocation getGetterNameLoc() const
Definition DeclObjC.h:892
ObjCMethodDecl * getGetterMethodDecl() const
Definition DeclObjC.h:907
ObjCMethodDecl * getSetterMethodDecl() const
Definition DeclObjC.h:910
SourceLocation getSetterNameLoc() const
Definition DeclObjC.h:900
SourceLocation getAtLoc() const
Definition DeclObjC.h:802
ObjCIvarDecl * getPropertyIvarDecl() const
Definition DeclObjC.h:930
Selector getSetterName() const
Definition DeclObjC.h:899
TypeSourceInfo * getTypeSourceInfo() const
Definition DeclObjC.h:808
QualType getType() const
Definition DeclObjC.h:810
Selector getGetterName() const
Definition DeclObjC.h:891
SourceLocation getLParenLoc() const
Definition DeclObjC.h:805
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const
Definition DeclObjC.h:833
ObjCPropertyAttribute::Kind getPropertyAttributes() const
Definition DeclObjC.h:821
PropertyControl getPropertyImplementation() const
Definition DeclObjC.h:918
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2811
ObjCIvarDecl * getPropertyIvarDecl() const
Definition DeclObjC.h:2885
SourceLocation getPropertyIvarDeclLoc() const
Definition DeclObjC.h:2888
Expr * getSetterCXXAssignment() const
Definition DeclObjC.h:2921
ObjCPropertyDecl * getPropertyDecl() const
Definition DeclObjC.h:2876
Expr * getGetterCXXConstructor() const
Definition DeclObjC.h:2913
ObjCMethodDecl * getSetterMethodDecl() const
Definition DeclObjC.h:2910
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclObjC.h:2873
ObjCMethodDecl * getGetterMethodDecl() const
Definition DeclObjC.h:2907
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2090
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
Definition DeclObjC.h:2267
protocol_loc_range protocol_locs() const
Definition DeclObjC.h:2188
protocol_range protocols() const
Definition DeclObjC.h:2167
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
unsigned protocol_size() const
Definition DeclObjC.h:2206
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:581
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
Definition DeclObjC.h:665
unsigned size() const
Determine the number of type parameters in this list.
Definition DeclObjC.h:692
SourceLocation getRAngleLoc() const
Definition DeclObjC.h:714
SourceLocation getLAngleLoc() const
Definition DeclObjC.h:713
ArrayRef< const OpenACCClause * > clauses() const
Definition DeclOpenACC.h:62
Represents a partial function definition.
Definition Decl.h:5013
ImplicitParamDecl * getParam(unsigned i) const
Definition Decl.h:5045
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
Definition Decl.cpp:5741
unsigned getNumParams() const
Definition Decl.h:5043
Represents a parameter to a function.
Definition Decl.h:1819
bool isKNRPromoted() const
True if the value passed to this parameter must undergo K&R-style default argument promotion:
Definition Decl.h:1900
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
Definition Decl.h:1879
SourceLocation getExplicitObjectParamThisLoc() const
Definition Decl.h:1915
bool isObjCMethodParameter() const
Definition Decl.h:1862
ObjCDeclQualifier getObjCDeclQualifier() const
Definition Decl.h:1883
bool hasUninstantiatedDefaultArg() const
Definition Decl.h:1952
bool hasInheritedDefaultArg() const
Definition Decl.h:1964
Expr * getUninstantiatedDefaultArg()
Definition Decl.cpp:3040
unsigned getFunctionScopeDepth() const
Definition Decl.h:1869
Represents a #pragma comment line.
Definition Decl.h:167
StringRef getArg() const
Definition Decl.h:190
PragmaMSCommentKind getCommentKind() const
Definition Decl.h:188
Represents a #pragma detect_mismatch line.
Definition Decl.h:201
StringRef getName() const
Definition Decl.h:222
StringRef getValue() const
Definition Decl.h:223
A (possibly-)qualified type.
Definition TypeBase.h:938
Represents a struct/union/class.
Definition Decl.h:4459
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5482
bool hasNonTrivialToPrimitiveDestructCUnion() const
Definition Decl.h:4569
bool hasNonTrivialToPrimitiveCopyCUnion() const
Definition Decl.h:4577
RecordArgPassingKind getArgPassingRestrictions() const
Definition Decl.h:4600
bool hasVolatileMember() const
Definition Decl.h:4522
bool hasFlexibleArrayMember() const
Definition Decl.h:4492
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Definition Decl.h:4561
bool hasObjectMember() const
Definition Decl.h:4519
bool isNonTrivialToPrimitiveDestroy() const
Definition Decl.h:4553
bool isNonTrivialToPrimitiveCopy() const
Definition Decl.h:4545
bool isParamDestroyedInCallee() const
Definition Decl.h:4609
RecordDecl * getMostRecentDecl()
Definition Decl.h:4485
bool hasUninitializedExplicitInitFields() const
Definition Decl.h:4585
bool isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C structs.
Definition Decl.h:4537
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Definition Decl.h:4511
Declaration of a redeclarable template.
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
RedeclarableTemplateDecl * getInstantiatedFromMemberTemplate() const
Retrieve the member template from which this template was instantiated, or nullptr if this template w...
Provides common interface for the Decls that can be redeclared.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Represents the body of a requires-expression.
Definition DeclCXX.h:2114
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool isLocalSourceLocation(SourceLocation Loc) const
Returns true if Loc did not come from a PCH/Module.
Represents a C++11 static_assert declaration.
Definition DeclCXX.h:4161
bool isFailed() const
Definition DeclCXX.h:4190
SourceLocation getRParenLoc() const
Definition DeclCXX.h:4192
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1819
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3851
SourceRange getBraceRange() const
Definition Decl.h:3928
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
Definition Decl.h:3947
bool isEmbeddedInDeclarator() const
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
Definition Decl.h:3976
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3952
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition Decl.h:4088
bool isCompleteDefinitionRequired() const
Return true if this complete decl is required to be complete for some existing use.
Definition Decl.h:3961
bool isFreeStanding() const
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3987
TagKind getTagKind() const
Definition Decl.h:4051
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Represents a template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
bool isNull() const
Determine whether this template name is NULL.
A template parameter object.
const APValue & getValue() const
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool wasDeclaredWithTypename() const
Whether this template template parameter was declared with the 'typename' keyword.
TemplateParameterList * getExpansionTemplateParameters(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
TemplateNameKind templateParameterKind() const
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
UnsignedOrNone getNumExpansionParameters() const
Whether this parameter is a template type parameter pack that has a known list of different type-cons...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
A declaration that models statements at global scope.
Definition Decl.h:4769
The top declaration context.
Definition Decl.h:105
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3822
TypeAliasTemplateDecl * getDescribedAliasTemplate() const
Definition Decl.h:3840
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
UnsignedOrNone getArgPackSubstIndex() const
Definition ASTConcept.h:250
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
Definition ASTConcept.h:244
ConceptReference * getConceptReference() const
Definition ASTConcept.h:248
Represents a declaration of a type.
Definition Decl.h:3647
const Type * getTypeForDecl() const
Definition Decl.h:3672
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:3681
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8484
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2139
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3801
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3696
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:3746
TypedefNameDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isModed() const
Definition Decl.h:3742
QualType getUnderlyingType() const
Definition Decl.h:3751
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
Definition Decl.cpp:5839
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4485
const APValue & getValue() const
Definition DeclCXX.h:4511
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition DeclCXX.h:4143
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4062
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
Definition DeclCXX.h:4092
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
Definition DeclCXX.h:4096
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Definition DeclCXX.h:4113
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3965
SourceLocation getUsingLoc() const
Returns the source location of the 'using' keyword.
Definition DeclCXX.h:3996
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
Definition DeclCXX.h:4006
SourceLocation getEllipsisLoc() const
Get the location of the ellipsis if this is a pack expansion.
Definition DeclCXX.h:4023
Represents a C++ using-declaration.
Definition DeclCXX.h:3616
bool hasTypename() const
Return true if the using declaration has 'typename'.
Definition DeclCXX.h:3665
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
Definition DeclCXX.h:3650
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Definition DeclCXX.h:3643
Represents C++ using-directive.
Definition DeclCXX.h:3121
SourceLocation getUsingLoc() const
Return the location of the using keyword.
Definition DeclCXX.h:3192
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Definition DeclCXX.cpp:3357
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
Definition DeclCXX.h:3188
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
Definition DeclCXX.h:3196
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Definition DeclCXX.h:3166
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3817
SourceLocation getEnumLoc() const
The source location of the 'enum' keyword.
Definition DeclCXX.h:3841
TypeSourceInfo * getEnumType() const
Definition DeclCXX.h:3853
SourceLocation getUsingLoc() const
The source location of the 'using' keyword.
Definition DeclCXX.h:3837
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Definition DeclCXX.h:3898
NamedDecl * getInstantiatedFromUsingDecl() const
Get the using declaration from which this was instantiated.
Definition DeclCXX.h:3927
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this pack expanded into.
Definition DeclCXX.h:3931
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3424
UsingShadowDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition DeclCXX.h:3488
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
QualType getType() const
Definition Decl.h:723
Represents a variable declaration or definition.
Definition Decl.h:932
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2782
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1593
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
Definition Decl.h:1490
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.h:1602
@ CInit
C-style initialization with assignment.
Definition Decl.h:937
bool isObjCForDecl() const
Determine whether this variable is a for-loop declaration for a for-in statement in Objective-C.
Definition Decl.h:1556
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
Definition Decl.cpp:2426
bool isInlineSpecified() const
Definition Decl.h:1578
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition Decl.h:1306
bool isCXXForRangeDecl() const
Determine whether this variable is the for-range-declaration in a C++0x for-range statement.
Definition Decl.h:1546
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
Definition Decl.h:1536
bool isCXXForRangeImplicitVar() const
Whether this variable is the implicit '__range' variable in C++ range-based for loops.
Definition Decl.h:1646
bool isExceptionVariable() const
Determine whether this variable is the exception variable in a C++ catch statememt or an Objective-C ...
Definition Decl.h:1518
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1575
ThreadStorageClassSpecifier getTSCSpec() const
Definition Decl.h:1183
const Expr * getInit() const
Definition Decl.h:1391
bool isARCPseudoStrong() const
Determine whether this variable is an ARC pseudo-__strong variable.
Definition Decl.h:1571
StorageDuration getStorageDuration() const
Get the storage duration of this variable, per C++ [basic.stc].
Definition Decl.h:1250
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1174
bool isEscapingByref() const
Indicates the capture is a __block variable that is captured by a block that can potentially escape (...
Definition Decl.cpp:2683
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
Definition Decl.h:1500
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
Definition Decl.h:1612
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Definition Decl.cpp:2751
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Definition Decl.cpp:2870
Declaration of a variable template.
VarTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
VarTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member variable template partial specialization from which this particular variable temp...
bool isMemberSpecialization() const
Determines whether this variable template partial specialization was a specialization of a member par...
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate the initializer of the vari...
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
llvm::PointerUnion< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the variable template or variable template partial specialization which was specialized by t...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
FriendTemplateDeclKind
Kinds of friend payloads owned by FriendTemplateDecl.
DeclCode
Record codes for each kind of declaration.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_EXPANSION_STMT
A C++ expansion statement.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_EXPLICIT_INSTANTIATION
An ExplicitInstantiationDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
@ EXPR_COMPOUND_ASSIGN_OPERATOR
A CompoundAssignOperator record.
@ EXPR_CXX_OPERATOR_CALL
A CXXOperatorCallExpr record.
@ EXPR_IMPLICIT_CAST
An ImplicitCastExpr record.
@ EXPR_CHARACTER_LITERAL
A CharacterLiteral record.
@ STMT_COMPOUND
A CompoundStmt record.
@ EXPR_CALL
A CallExpr record.
@ EXPR_BINARY_OPERATOR
A BinaryOperator record.
@ EXPR_DECL_REF
A DeclRefExpr record.
@ EXPR_INTEGER_LITERAL
An IntegerLiteral record.
@ EXPR_CXX_MEMBER_CALL
A CXXMemberCallExpr record.
bool isRedeclarableDeclKind(unsigned Kind)
Determine whether the given declaration kind is redeclarable.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
Definition ASTCommon.h:96
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ GVA_StrongExternal
Definition Linkage.h:76
@ GVA_AvailableExternally
Definition Linkage.h:74
@ GVA_Internal
Definition Linkage.h:73
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Definition Template.h:50
@ AS_none
Definition Specifiers.h:128
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ SD_Thread
Thread storage duration.
Definition Specifiers.h:341
@ SD_Static
Static storage duration.
Definition Specifiers.h:342
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
@ ExplicitInstantiation
We are parsing an explicit instantiation.
Definition Parser.h:85
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:579
bool CanElideDeclDef(const Decl *D)
If we can elide the definition of.
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:207
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:203
U cast(CodeGen::Address addr)
Definition Address.h:327
bool isExternallyVisible(Linkage L)
Definition Linkage.h:90
unsigned long uint64_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
const Expr * ConstraintExpr
Definition Decl.h:88
UnsignedOrNone ArgPackSubstIndex
Definition Decl.h:89
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Definition Expr.h:6744
Data that is common to all of the declarations of a given function template.
uint16_t Part2
...-89ab-...
Definition DeclCXX.h:4407
uint32_t Part1
{01234567-...
Definition DeclCXX.h:4405
uint16_t Part3
...-cdef-...
Definition DeclCXX.h:4409
uint8_t Part4And5[8]
...-0123-456789abcdef}
Definition DeclCXX.h:4411
static DeclType * getDecl(EntryType *D)