DeclBase.cpp revision 363496
1//===- DeclBase.cpp - Declaration AST Node Implementation -----------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the Decl and DeclContext classes.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/AST/DeclBase.h"
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/ASTLambda.h"
16#include "clang/AST/ASTMutationListener.h"
17#include "clang/AST/Attr.h"
18#include "clang/AST/AttrIterator.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/DeclCXX.h"
21#include "clang/AST/DeclContextInternals.h"
22#include "clang/AST/DeclFriend.h"
23#include "clang/AST/DeclObjC.h"
24#include "clang/AST/DeclOpenMP.h"
25#include "clang/AST/DeclTemplate.h"
26#include "clang/AST/DependentDiagnostic.h"
27#include "clang/AST/ExternalASTSource.h"
28#include "clang/AST/Stmt.h"
29#include "clang/AST/Type.h"
30#include "clang/Basic/IdentifierTable.h"
31#include "clang/Basic/LLVM.h"
32#include "clang/Basic/LangOptions.h"
33#include "clang/Basic/ObjCRuntime.h"
34#include "clang/Basic/PartialDiagnostic.h"
35#include "clang/Basic/SourceLocation.h"
36#include "clang/Basic/TargetInfo.h"
37#include "llvm/ADT/ArrayRef.h"
38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/SmallVector.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/Support/Casting.h"
42#include "llvm/Support/ErrorHandling.h"
43#include "llvm/Support/MathExtras.h"
44#include "llvm/Support/VersionTuple.h"
45#include "llvm/Support/raw_ostream.h"
46#include <algorithm>
47#include <cassert>
48#include <cstddef>
49#include <string>
50#include <tuple>
51#include <utility>
52
53using namespace clang;
54
55//===----------------------------------------------------------------------===//
56//  Statistics
57//===----------------------------------------------------------------------===//
58
59#define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
60#define ABSTRACT_DECL(DECL)
61#include "clang/AST/DeclNodes.inc"
62
63void Decl::updateOutOfDate(IdentifierInfo &II) const {
64  getASTContext().getExternalSource()->updateOutOfDateIdentifier(II);
65}
66
67#define DECL(DERIVED, BASE)                                                    \
68  static_assert(alignof(Decl) >= alignof(DERIVED##Decl),                       \
69                "Alignment sufficient after objects prepended to " #DERIVED);
70#define ABSTRACT_DECL(DECL)
71#include "clang/AST/DeclNodes.inc"
72
73void *Decl::operator new(std::size_t Size, const ASTContext &Context,
74                         unsigned ID, std::size_t Extra) {
75  // Allocate an extra 8 bytes worth of storage, which ensures that the
76  // resulting pointer will still be 8-byte aligned.
77  static_assert(sizeof(unsigned) * 2 >= alignof(Decl),
78                "Decl won't be misaligned");
79  void *Start = Context.Allocate(Size + Extra + 8);
80  void *Result = (char*)Start + 8;
81
82  unsigned *PrefixPtr = (unsigned *)Result - 2;
83
84  // Zero out the first 4 bytes; this is used to store the owning module ID.
85  PrefixPtr[0] = 0;
86
87  // Store the global declaration ID in the second 4 bytes.
88  PrefixPtr[1] = ID;
89
90  return Result;
91}
92
93void *Decl::operator new(std::size_t Size, const ASTContext &Ctx,
94                         DeclContext *Parent, std::size_t Extra) {
95  assert(!Parent || &Parent->getParentASTContext() == &Ctx);
96  // With local visibility enabled, we track the owning module even for local
97  // declarations. We create the TU decl early and may not yet know what the
98  // LangOpts are, so conservatively allocate the storage.
99  if (Ctx.getLangOpts().trackLocalOwningModule() || !Parent) {
100    // Ensure required alignment of the resulting object by adding extra
101    // padding at the start if required.
102    size_t ExtraAlign =
103        llvm::offsetToAlignment(sizeof(Module *), llvm::Align(alignof(Decl)));
104    auto *Buffer = reinterpret_cast<char *>(
105        ::operator new(ExtraAlign + sizeof(Module *) + Size + Extra, Ctx));
106    Buffer += ExtraAlign;
107    auto *ParentModule =
108        Parent ? cast<Decl>(Parent)->getOwningModule() : nullptr;
109    return new (Buffer) Module*(ParentModule) + 1;
110  }
111  return ::operator new(Size + Extra, Ctx);
112}
113
114Module *Decl::getOwningModuleSlow() const {
115  assert(isFromASTFile() && "Not from AST file?");
116  return getASTContext().getExternalSource()->getModule(getOwningModuleID());
117}
118
119bool Decl::hasLocalOwningModuleStorage() const {
120  return getASTContext().getLangOpts().trackLocalOwningModule();
121}
122
123const char *Decl::getDeclKindName() const {
124  switch (DeclKind) {
125  default: llvm_unreachable("Declaration not in DeclNodes.inc!");
126#define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
127#define ABSTRACT_DECL(DECL)
128#include "clang/AST/DeclNodes.inc"
129  }
130}
131
132void Decl::setInvalidDecl(bool Invalid) {
133  InvalidDecl = Invalid;
134  assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
135  if (!Invalid) {
136    return;
137  }
138
139  if (!isa<ParmVarDecl>(this)) {
140    // Defensive maneuver for ill-formed code: we're likely not to make it to
141    // a point where we set the access specifier, so default it to "public"
142    // to avoid triggering asserts elsewhere in the front end.
143    setAccess(AS_public);
144  }
145
146  // Marking a DecompositionDecl as invalid implies all the child BindingDecl's
147  // are invalid too.
148  if (auto *DD = dyn_cast<DecompositionDecl>(this)) {
149    for (auto *Binding : DD->bindings()) {
150      Binding->setInvalidDecl();
151    }
152  }
153}
154
155const char *DeclContext::getDeclKindName() const {
156  switch (getDeclKind()) {
157#define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
158#define ABSTRACT_DECL(DECL)
159#include "clang/AST/DeclNodes.inc"
160  }
161  llvm_unreachable("Declaration context not in DeclNodes.inc!");
162}
163
164bool Decl::StatisticsEnabled = false;
165void Decl::EnableStatistics() {
166  StatisticsEnabled = true;
167}
168
169void Decl::PrintStats() {
170  llvm::errs() << "\n*** Decl Stats:\n";
171
172  int totalDecls = 0;
173#define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
174#define ABSTRACT_DECL(DECL)
175#include "clang/AST/DeclNodes.inc"
176  llvm::errs() << "  " << totalDecls << " decls total.\n";
177
178  int totalBytes = 0;
179#define DECL(DERIVED, BASE)                                             \
180  if (n##DERIVED##s > 0) {                                              \
181    totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl));         \
182    llvm::errs() << "    " << n##DERIVED##s << " " #DERIVED " decls, "  \
183                 << sizeof(DERIVED##Decl) << " each ("                  \
184                 << n##DERIVED##s * sizeof(DERIVED##Decl)               \
185                 << " bytes)\n";                                        \
186  }
187#define ABSTRACT_DECL(DECL)
188#include "clang/AST/DeclNodes.inc"
189
190  llvm::errs() << "Total bytes = " << totalBytes << "\n";
191}
192
193void Decl::add(Kind k) {
194  switch (k) {
195#define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
196#define ABSTRACT_DECL(DECL)
197#include "clang/AST/DeclNodes.inc"
198  }
199}
200
201bool Decl::isTemplateParameterPack() const {
202  if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(this))
203    return TTP->isParameterPack();
204  if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(this))
205    return NTTP->isParameterPack();
206  if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(this))
207    return TTP->isParameterPack();
208  return false;
209}
210
211bool Decl::isParameterPack() const {
212  if (const auto *Var = dyn_cast<VarDecl>(this))
213    return Var->isParameterPack();
214
215  return isTemplateParameterPack();
216}
217
218FunctionDecl *Decl::getAsFunction() {
219  if (auto *FD = dyn_cast<FunctionDecl>(this))
220    return FD;
221  if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
222    return FTD->getTemplatedDecl();
223  return nullptr;
224}
225
226bool Decl::isTemplateDecl() const {
227  return isa<TemplateDecl>(this);
228}
229
230TemplateDecl *Decl::getDescribedTemplate() const {
231  if (auto *FD = dyn_cast<FunctionDecl>(this))
232    return FD->getDescribedFunctionTemplate();
233  else if (auto *RD = dyn_cast<CXXRecordDecl>(this))
234    return RD->getDescribedClassTemplate();
235  else if (auto *VD = dyn_cast<VarDecl>(this))
236    return VD->getDescribedVarTemplate();
237  else if (auto *AD = dyn_cast<TypeAliasDecl>(this))
238    return AD->getDescribedAliasTemplate();
239
240  return nullptr;
241}
242
243bool Decl::isTemplated() const {
244  // A declaration is dependent if it is a template or a template pattern, or
245  // is within (lexcially for a friend, semantically otherwise) a dependent
246  // context.
247  // FIXME: Should local extern declarations be treated like friends?
248  if (auto *AsDC = dyn_cast<DeclContext>(this))
249    return AsDC->isDependentContext();
250  auto *DC = getFriendObjectKind() ? getLexicalDeclContext() : getDeclContext();
251  return DC->isDependentContext() || isTemplateDecl() || getDescribedTemplate();
252}
253
254const DeclContext *Decl::getParentFunctionOrMethod() const {
255  for (const DeclContext *DC = getDeclContext();
256       DC && !DC->isTranslationUnit() && !DC->isNamespace();
257       DC = DC->getParent())
258    if (DC->isFunctionOrMethod())
259      return DC;
260
261  return nullptr;
262}
263
264//===----------------------------------------------------------------------===//
265// PrettyStackTraceDecl Implementation
266//===----------------------------------------------------------------------===//
267
268void PrettyStackTraceDecl::print(raw_ostream &OS) const {
269  SourceLocation TheLoc = Loc;
270  if (TheLoc.isInvalid() && TheDecl)
271    TheLoc = TheDecl->getLocation();
272
273  if (TheLoc.isValid()) {
274    TheLoc.print(OS, SM);
275    OS << ": ";
276  }
277
278  OS << Message;
279
280  if (const auto *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) {
281    OS << " '";
282    DN->printQualifiedName(OS);
283    OS << '\'';
284  }
285  OS << '\n';
286}
287
288//===----------------------------------------------------------------------===//
289// Decl Implementation
290//===----------------------------------------------------------------------===//
291
292// Out-of-line virtual method providing a home for Decl.
293Decl::~Decl() = default;
294
295void Decl::setDeclContext(DeclContext *DC) {
296  DeclCtx = DC;
297}
298
299void Decl::setLexicalDeclContext(DeclContext *DC) {
300  if (DC == getLexicalDeclContext())
301    return;
302
303  if (isInSemaDC()) {
304    setDeclContextsImpl(getDeclContext(), DC, getASTContext());
305  } else {
306    getMultipleDC()->LexicalDC = DC;
307  }
308
309  // FIXME: We shouldn't be changing the lexical context of declarations
310  // imported from AST files.
311  if (!isFromASTFile()) {
312    setModuleOwnershipKind(getModuleOwnershipKindForChildOf(DC));
313    if (hasOwningModule())
314      setLocalOwningModule(cast<Decl>(DC)->getOwningModule());
315  }
316
317  assert(
318      (getModuleOwnershipKind() != ModuleOwnershipKind::VisibleWhenImported ||
319       getOwningModule()) &&
320      "hidden declaration has no owning module");
321}
322
323void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
324                               ASTContext &Ctx) {
325  if (SemaDC == LexicalDC) {
326    DeclCtx = SemaDC;
327  } else {
328    auto *MDC = new (Ctx) Decl::MultipleDC();
329    MDC->SemanticDC = SemaDC;
330    MDC->LexicalDC = LexicalDC;
331    DeclCtx = MDC;
332  }
333}
334
335bool Decl::isInLocalScope() const {
336  const DeclContext *LDC = getLexicalDeclContext();
337  while (true) {
338    if (LDC->isFunctionOrMethod())
339      return true;
340    if (!isa<TagDecl>(LDC))
341      return false;
342    if (const auto *CRD = dyn_cast<CXXRecordDecl>(LDC))
343      if (CRD->isLambda())
344        return true;
345    LDC = LDC->getLexicalParent();
346  }
347  return false;
348}
349
350bool Decl::isInAnonymousNamespace() const {
351  for (const DeclContext *DC = getDeclContext(); DC; DC = DC->getParent()) {
352    if (const auto *ND = dyn_cast<NamespaceDecl>(DC))
353      if (ND->isAnonymousNamespace())
354        return true;
355  }
356
357  return false;
358}
359
360bool Decl::isInStdNamespace() const {
361  const DeclContext *DC = getDeclContext();
362  return DC && DC->isStdNamespace();
363}
364
365TranslationUnitDecl *Decl::getTranslationUnitDecl() {
366  if (auto *TUD = dyn_cast<TranslationUnitDecl>(this))
367    return TUD;
368
369  DeclContext *DC = getDeclContext();
370  assert(DC && "This decl is not contained in a translation unit!");
371
372  while (!DC->isTranslationUnit()) {
373    DC = DC->getParent();
374    assert(DC && "This decl is not contained in a translation unit!");
375  }
376
377  return cast<TranslationUnitDecl>(DC);
378}
379
380ASTContext &Decl::getASTContext() const {
381  return getTranslationUnitDecl()->getASTContext();
382}
383
384ASTMutationListener *Decl::getASTMutationListener() const {
385  return getASTContext().getASTMutationListener();
386}
387
388unsigned Decl::getMaxAlignment() const {
389  if (!hasAttrs())
390    return 0;
391
392  unsigned Align = 0;
393  const AttrVec &V = getAttrs();
394  ASTContext &Ctx = getASTContext();
395  specific_attr_iterator<AlignedAttr> I(V.begin()), E(V.end());
396  for (; I != E; ++I)
397    Align = std::max(Align, I->getAlignment(Ctx));
398  return Align;
399}
400
401bool Decl::isUsed(bool CheckUsedAttr) const {
402  const Decl *CanonD = getCanonicalDecl();
403  if (CanonD->Used)
404    return true;
405
406  // Check for used attribute.
407  // Ask the most recent decl, since attributes accumulate in the redecl chain.
408  if (CheckUsedAttr && getMostRecentDecl()->hasAttr<UsedAttr>())
409    return true;
410
411  // The information may have not been deserialized yet. Force deserialization
412  // to complete the needed information.
413  return getMostRecentDecl()->getCanonicalDecl()->Used;
414}
415
416void Decl::markUsed(ASTContext &C) {
417  if (isUsed(false))
418    return;
419
420  if (C.getASTMutationListener())
421    C.getASTMutationListener()->DeclarationMarkedUsed(this);
422
423  setIsUsed();
424}
425
426bool Decl::isReferenced() const {
427  if (Referenced)
428    return true;
429
430  // Check redeclarations.
431  for (const auto *I : redecls())
432    if (I->Referenced)
433      return true;
434
435  return false;
436}
437
438ExternalSourceSymbolAttr *Decl::getExternalSourceSymbolAttr() const {
439  const Decl *Definition = nullptr;
440  if (auto *ID = dyn_cast<ObjCInterfaceDecl>(this)) {
441    Definition = ID->getDefinition();
442  } else if (auto *PD = dyn_cast<ObjCProtocolDecl>(this)) {
443    Definition = PD->getDefinition();
444  } else if (auto *TD = dyn_cast<TagDecl>(this)) {
445    Definition = TD->getDefinition();
446  }
447  if (!Definition)
448    Definition = this;
449
450  if (auto *attr = Definition->getAttr<ExternalSourceSymbolAttr>())
451    return attr;
452  if (auto *dcd = dyn_cast<Decl>(getDeclContext())) {
453    return dcd->getAttr<ExternalSourceSymbolAttr>();
454  }
455
456  return nullptr;
457}
458
459bool Decl::hasDefiningAttr() const {
460  return hasAttr<AliasAttr>() || hasAttr<IFuncAttr>();
461}
462
463const Attr *Decl::getDefiningAttr() const {
464  if (auto *AA = getAttr<AliasAttr>())
465    return AA;
466  if (auto *IFA = getAttr<IFuncAttr>())
467    return IFA;
468  return nullptr;
469}
470
471static StringRef getRealizedPlatform(const AvailabilityAttr *A,
472                                     const ASTContext &Context) {
473  // Check if this is an App Extension "platform", and if so chop off
474  // the suffix for matching with the actual platform.
475  StringRef RealizedPlatform = A->getPlatform()->getName();
476  if (!Context.getLangOpts().AppExt)
477    return RealizedPlatform;
478  size_t suffix = RealizedPlatform.rfind("_app_extension");
479  if (suffix != StringRef::npos)
480    return RealizedPlatform.slice(0, suffix);
481  return RealizedPlatform;
482}
483
484/// Determine the availability of the given declaration based on
485/// the target platform.
486///
487/// When it returns an availability result other than \c AR_Available,
488/// if the \p Message parameter is non-NULL, it will be set to a
489/// string describing why the entity is unavailable.
490///
491/// FIXME: Make these strings localizable, since they end up in
492/// diagnostics.
493static AvailabilityResult CheckAvailability(ASTContext &Context,
494                                            const AvailabilityAttr *A,
495                                            std::string *Message,
496                                            VersionTuple EnclosingVersion) {
497  if (EnclosingVersion.empty())
498    EnclosingVersion = Context.getTargetInfo().getPlatformMinVersion();
499
500  if (EnclosingVersion.empty())
501    return AR_Available;
502
503  StringRef ActualPlatform = A->getPlatform()->getName();
504  StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
505
506  // Match the platform name.
507  if (getRealizedPlatform(A, Context) != TargetPlatform)
508    return AR_Available;
509
510  StringRef PrettyPlatformName
511    = AvailabilityAttr::getPrettyPlatformName(ActualPlatform);
512
513  if (PrettyPlatformName.empty())
514    PrettyPlatformName = ActualPlatform;
515
516  std::string HintMessage;
517  if (!A->getMessage().empty()) {
518    HintMessage = " - ";
519    HintMessage += A->getMessage();
520  }
521
522  // Make sure that this declaration has not been marked 'unavailable'.
523  if (A->getUnavailable()) {
524    if (Message) {
525      Message->clear();
526      llvm::raw_string_ostream Out(*Message);
527      Out << "not available on " << PrettyPlatformName
528          << HintMessage;
529    }
530
531    return AR_Unavailable;
532  }
533
534  // Make sure that this declaration has already been introduced.
535  if (!A->getIntroduced().empty() &&
536      EnclosingVersion < A->getIntroduced()) {
537    if (Message) {
538      Message->clear();
539      llvm::raw_string_ostream Out(*Message);
540      VersionTuple VTI(A->getIntroduced());
541      Out << "introduced in " << PrettyPlatformName << ' '
542          << VTI << HintMessage;
543    }
544
545    return A->getStrict() ? AR_Unavailable : AR_NotYetIntroduced;
546  }
547
548  // Make sure that this declaration hasn't been obsoleted.
549  if (!A->getObsoleted().empty() && EnclosingVersion >= A->getObsoleted()) {
550    if (Message) {
551      Message->clear();
552      llvm::raw_string_ostream Out(*Message);
553      VersionTuple VTO(A->getObsoleted());
554      Out << "obsoleted in " << PrettyPlatformName << ' '
555          << VTO << HintMessage;
556    }
557
558    return AR_Unavailable;
559  }
560
561  // Make sure that this declaration hasn't been deprecated.
562  if (!A->getDeprecated().empty() && EnclosingVersion >= A->getDeprecated()) {
563    if (Message) {
564      Message->clear();
565      llvm::raw_string_ostream Out(*Message);
566      VersionTuple VTD(A->getDeprecated());
567      Out << "first deprecated in " << PrettyPlatformName << ' '
568          << VTD << HintMessage;
569    }
570
571    return AR_Deprecated;
572  }
573
574  return AR_Available;
575}
576
577AvailabilityResult Decl::getAvailability(std::string *Message,
578                                         VersionTuple EnclosingVersion,
579                                         StringRef *RealizedPlatform) const {
580  if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
581    return FTD->getTemplatedDecl()->getAvailability(Message, EnclosingVersion,
582                                                    RealizedPlatform);
583
584  AvailabilityResult Result = AR_Available;
585  std::string ResultMessage;
586
587  for (const auto *A : attrs()) {
588    if (const auto *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
589      if (Result >= AR_Deprecated)
590        continue;
591
592      if (Message)
593        ResultMessage = Deprecated->getMessage();
594
595      Result = AR_Deprecated;
596      continue;
597    }
598
599    if (const auto *Unavailable = dyn_cast<UnavailableAttr>(A)) {
600      if (Message)
601        *Message = Unavailable->getMessage();
602      return AR_Unavailable;
603    }
604
605    if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
606      AvailabilityResult AR = CheckAvailability(getASTContext(), Availability,
607                                                Message, EnclosingVersion);
608
609      if (AR == AR_Unavailable) {
610        if (RealizedPlatform)
611          *RealizedPlatform = Availability->getPlatform()->getName();
612        return AR_Unavailable;
613      }
614
615      if (AR > Result) {
616        Result = AR;
617        if (Message)
618          ResultMessage.swap(*Message);
619      }
620      continue;
621    }
622  }
623
624  if (Message)
625    Message->swap(ResultMessage);
626  return Result;
627}
628
629VersionTuple Decl::getVersionIntroduced() const {
630  const ASTContext &Context = getASTContext();
631  StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
632  for (const auto *A : attrs()) {
633    if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
634      if (getRealizedPlatform(Availability, Context) != TargetPlatform)
635        continue;
636      if (!Availability->getIntroduced().empty())
637        return Availability->getIntroduced();
638    }
639  }
640  return {};
641}
642
643bool Decl::canBeWeakImported(bool &IsDefinition) const {
644  IsDefinition = false;
645
646  // Variables, if they aren't definitions.
647  if (const auto *Var = dyn_cast<VarDecl>(this)) {
648    if (Var->isThisDeclarationADefinition()) {
649      IsDefinition = true;
650      return false;
651    }
652    return true;
653
654  // Functions, if they aren't definitions.
655  } else if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
656    if (FD->hasBody()) {
657      IsDefinition = true;
658      return false;
659    }
660    return true;
661
662  // Objective-C classes, if this is the non-fragile runtime.
663  } else if (isa<ObjCInterfaceDecl>(this) &&
664             getASTContext().getLangOpts().ObjCRuntime.hasWeakClassImport()) {
665    return true;
666
667  // Nothing else.
668  } else {
669    return false;
670  }
671}
672
673bool Decl::isWeakImported() const {
674  bool IsDefinition;
675  if (!canBeWeakImported(IsDefinition))
676    return false;
677
678  for (const auto *A : attrs()) {
679    if (isa<WeakImportAttr>(A))
680      return true;
681
682    if (const auto *Availability = dyn_cast<AvailabilityAttr>(A)) {
683      if (CheckAvailability(getASTContext(), Availability, nullptr,
684                            VersionTuple()) == AR_NotYetIntroduced)
685        return true;
686    }
687  }
688
689  return false;
690}
691
692unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
693  switch (DeclKind) {
694    case Function:
695    case CXXDeductionGuide:
696    case CXXMethod:
697    case CXXConstructor:
698    case ConstructorUsingShadow:
699    case CXXDestructor:
700    case CXXConversion:
701    case EnumConstant:
702    case Var:
703    case ImplicitParam:
704    case ParmVar:
705    case ObjCMethod:
706    case ObjCProperty:
707    case MSProperty:
708      return IDNS_Ordinary;
709    case Label:
710      return IDNS_Label;
711    case IndirectField:
712      return IDNS_Ordinary | IDNS_Member;
713
714    case Binding:
715    case NonTypeTemplateParm:
716    case VarTemplate:
717    case Concept:
718      // These (C++-only) declarations are found by redeclaration lookup for
719      // tag types, so we include them in the tag namespace.
720      return IDNS_Ordinary | IDNS_Tag;
721
722    case ObjCCompatibleAlias:
723    case ObjCInterface:
724      return IDNS_Ordinary | IDNS_Type;
725
726    case Typedef:
727    case TypeAlias:
728    case TemplateTypeParm:
729    case ObjCTypeParam:
730      return IDNS_Ordinary | IDNS_Type;
731
732    case UnresolvedUsingTypename:
733      return IDNS_Ordinary | IDNS_Type | IDNS_Using;
734
735    case UsingShadow:
736      return 0; // we'll actually overwrite this later
737
738    case UnresolvedUsingValue:
739      return IDNS_Ordinary | IDNS_Using;
740
741    case Using:
742    case UsingPack:
743      return IDNS_Using;
744
745    case ObjCProtocol:
746      return IDNS_ObjCProtocol;
747
748    case Field:
749    case ObjCAtDefsField:
750    case ObjCIvar:
751      return IDNS_Member;
752
753    case Record:
754    case CXXRecord:
755    case Enum:
756      return IDNS_Tag | IDNS_Type;
757
758    case Namespace:
759    case NamespaceAlias:
760      return IDNS_Namespace;
761
762    case FunctionTemplate:
763      return IDNS_Ordinary;
764
765    case ClassTemplate:
766    case TemplateTemplateParm:
767    case TypeAliasTemplate:
768      return IDNS_Ordinary | IDNS_Tag | IDNS_Type;
769
770    case OMPDeclareReduction:
771      return IDNS_OMPReduction;
772
773    case OMPDeclareMapper:
774      return IDNS_OMPMapper;
775
776    // Never have names.
777    case Friend:
778    case FriendTemplate:
779    case AccessSpec:
780    case LinkageSpec:
781    case Export:
782    case FileScopeAsm:
783    case StaticAssert:
784    case ObjCPropertyImpl:
785    case PragmaComment:
786    case PragmaDetectMismatch:
787    case Block:
788    case Captured:
789    case TranslationUnit:
790    case ExternCContext:
791    case Decomposition:
792
793    case UsingDirective:
794    case BuiltinTemplate:
795    case ClassTemplateSpecialization:
796    case ClassTemplatePartialSpecialization:
797    case ClassScopeFunctionSpecialization:
798    case VarTemplateSpecialization:
799    case VarTemplatePartialSpecialization:
800    case ObjCImplementation:
801    case ObjCCategory:
802    case ObjCCategoryImpl:
803    case Import:
804    case OMPThreadPrivate:
805    case OMPAllocate:
806    case OMPRequires:
807    case OMPCapturedExpr:
808    case Empty:
809    case LifetimeExtendedTemporary:
810    case RequiresExprBody:
811      // Never looked up by name.
812      return 0;
813  }
814
815  llvm_unreachable("Invalid DeclKind!");
816}
817
818void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
819  assert(!HasAttrs && "Decl already contains attrs.");
820
821  AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
822  assert(AttrBlank.empty() && "HasAttrs was wrong?");
823
824  AttrBlank = attrs;
825  HasAttrs = true;
826}
827
828void Decl::dropAttrs() {
829  if (!HasAttrs) return;
830
831  HasAttrs = false;
832  getASTContext().eraseDeclAttrs(this);
833}
834
835void Decl::addAttr(Attr *A) {
836  if (!hasAttrs()) {
837    setAttrs(AttrVec(1, A));
838    return;
839  }
840
841  AttrVec &Attrs = getAttrs();
842  if (!A->isInherited()) {
843    Attrs.push_back(A);
844    return;
845  }
846
847  // Attribute inheritance is processed after attribute parsing. To keep the
848  // order as in the source code, add inherited attributes before non-inherited
849  // ones.
850  auto I = Attrs.begin(), E = Attrs.end();
851  for (; I != E; ++I) {
852    if (!(*I)->isInherited())
853      break;
854  }
855  Attrs.insert(I, A);
856}
857
858const AttrVec &Decl::getAttrs() const {
859  assert(HasAttrs && "No attrs to get!");
860  return getASTContext().getDeclAttrs(this);
861}
862
863Decl *Decl::castFromDeclContext (const DeclContext *D) {
864  Decl::Kind DK = D->getDeclKind();
865  switch(DK) {
866#define DECL(NAME, BASE)
867#define DECL_CONTEXT(NAME) \
868    case Decl::NAME:       \
869      return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
870#define DECL_CONTEXT_BASE(NAME)
871#include "clang/AST/DeclNodes.inc"
872    default:
873#define DECL(NAME, BASE)
874#define DECL_CONTEXT_BASE(NAME)                  \
875      if (DK >= first##NAME && DK <= last##NAME) \
876        return static_cast<NAME##Decl *>(const_cast<DeclContext *>(D));
877#include "clang/AST/DeclNodes.inc"
878      llvm_unreachable("a decl that inherits DeclContext isn't handled");
879  }
880}
881
882DeclContext *Decl::castToDeclContext(const Decl *D) {
883  Decl::Kind DK = D->getKind();
884  switch(DK) {
885#define DECL(NAME, BASE)
886#define DECL_CONTEXT(NAME) \
887    case Decl::NAME:       \
888      return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
889#define DECL_CONTEXT_BASE(NAME)
890#include "clang/AST/DeclNodes.inc"
891    default:
892#define DECL(NAME, BASE)
893#define DECL_CONTEXT_BASE(NAME)                                   \
894      if (DK >= first##NAME && DK <= last##NAME)                  \
895        return static_cast<NAME##Decl *>(const_cast<Decl *>(D));
896#include "clang/AST/DeclNodes.inc"
897      llvm_unreachable("a decl that inherits DeclContext isn't handled");
898  }
899}
900
901SourceLocation Decl::getBodyRBrace() const {
902  // Special handling of FunctionDecl to avoid de-serializing the body from PCH.
903  // FunctionDecl stores EndRangeLoc for this purpose.
904  if (const auto *FD = dyn_cast<FunctionDecl>(this)) {
905    const FunctionDecl *Definition;
906    if (FD->hasBody(Definition))
907      return Definition->getSourceRange().getEnd();
908    return {};
909  }
910
911  if (Stmt *Body = getBody())
912    return Body->getSourceRange().getEnd();
913
914  return {};
915}
916
917bool Decl::AccessDeclContextSanity() const {
918#ifndef NDEBUG
919  // Suppress this check if any of the following hold:
920  // 1. this is the translation unit (and thus has no parent)
921  // 2. this is a template parameter (and thus doesn't belong to its context)
922  // 3. this is a non-type template parameter
923  // 4. the context is not a record
924  // 5. it's invalid
925  // 6. it's a C++0x static_assert.
926  // 7. it's a block literal declaration
927  if (isa<TranslationUnitDecl>(this) ||
928      isa<TemplateTypeParmDecl>(this) ||
929      isa<NonTypeTemplateParmDecl>(this) ||
930      !getDeclContext() ||
931      !isa<CXXRecordDecl>(getDeclContext()) ||
932      isInvalidDecl() ||
933      isa<StaticAssertDecl>(this) ||
934      isa<BlockDecl>(this) ||
935      // FIXME: a ParmVarDecl can have ClassTemplateSpecialization
936      // as DeclContext (?).
937      isa<ParmVarDecl>(this) ||
938      // FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have
939      // AS_none as access specifier.
940      isa<CXXRecordDecl>(this) ||
941      isa<ClassScopeFunctionSpecializationDecl>(this))
942    return true;
943
944  assert(Access != AS_none &&
945         "Access specifier is AS_none inside a record decl");
946#endif
947  return true;
948}
949
950static Decl::Kind getKind(const Decl *D) { return D->getKind(); }
951static Decl::Kind getKind(const DeclContext *DC) { return DC->getDeclKind(); }
952
953int64_t Decl::getID() const {
954  return getASTContext().getAllocator().identifyKnownAlignedObject<Decl>(this);
955}
956
957const FunctionType *Decl::getFunctionType(bool BlocksToo) const {
958  QualType Ty;
959  if (const auto *D = dyn_cast<ValueDecl>(this))
960    Ty = D->getType();
961  else if (const auto *D = dyn_cast<TypedefNameDecl>(this))
962    Ty = D->getUnderlyingType();
963  else
964    return nullptr;
965
966  if (Ty->isFunctionPointerType())
967    Ty = Ty->castAs<PointerType>()->getPointeeType();
968  else if (Ty->isFunctionReferenceType())
969    Ty = Ty->castAs<ReferenceType>()->getPointeeType();
970  else if (BlocksToo && Ty->isBlockPointerType())
971    Ty = Ty->castAs<BlockPointerType>()->getPointeeType();
972
973  return Ty->getAs<FunctionType>();
974}
975
976/// Starting at a given context (a Decl or DeclContext), look for a
977/// code context that is not a closure (a lambda, block, etc.).
978template <class T> static Decl *getNonClosureContext(T *D) {
979  if (getKind(D) == Decl::CXXMethod) {
980    auto *MD = cast<CXXMethodDecl>(D);
981    if (MD->getOverloadedOperator() == OO_Call &&
982        MD->getParent()->isLambda())
983      return getNonClosureContext(MD->getParent()->getParent());
984    return MD;
985  } else if (auto *FD = dyn_cast<FunctionDecl>(D))
986    return FD;
987  else if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
988    return MD;
989  else if (auto *BD = dyn_cast<BlockDecl>(D))
990    return getNonClosureContext(BD->getParent());
991  else if (auto *CD = dyn_cast<CapturedDecl>(D))
992    return getNonClosureContext(CD->getParent());
993  else
994    return nullptr;
995}
996
997Decl *Decl::getNonClosureContext() {
998  return ::getNonClosureContext(this);
999}
1000
1001Decl *DeclContext::getNonClosureAncestor() {
1002  return ::getNonClosureContext(this);
1003}
1004
1005//===----------------------------------------------------------------------===//
1006// DeclContext Implementation
1007//===----------------------------------------------------------------------===//
1008
1009DeclContext::DeclContext(Decl::Kind K) {
1010  DeclContextBits.DeclKind = K;
1011  setHasExternalLexicalStorage(false);
1012  setHasExternalVisibleStorage(false);
1013  setNeedToReconcileExternalVisibleStorage(false);
1014  setHasLazyLocalLexicalLookups(false);
1015  setHasLazyExternalLexicalLookups(false);
1016  setUseQualifiedLookup(false);
1017}
1018
1019bool DeclContext::classof(const Decl *D) {
1020  switch (D->getKind()) {
1021#define DECL(NAME, BASE)
1022#define DECL_CONTEXT(NAME) case Decl::NAME:
1023#define DECL_CONTEXT_BASE(NAME)
1024#include "clang/AST/DeclNodes.inc"
1025      return true;
1026    default:
1027#define DECL(NAME, BASE)
1028#define DECL_CONTEXT_BASE(NAME)                 \
1029      if (D->getKind() >= Decl::first##NAME &&  \
1030          D->getKind() <= Decl::last##NAME)     \
1031        return true;
1032#include "clang/AST/DeclNodes.inc"
1033      return false;
1034  }
1035}
1036
1037DeclContext::~DeclContext() = default;
1038
1039/// Find the parent context of this context that will be
1040/// used for unqualified name lookup.
1041///
1042/// Generally, the parent lookup context is the semantic context. However, for
1043/// a friend function the parent lookup context is the lexical context, which
1044/// is the class in which the friend is declared.
1045DeclContext *DeclContext::getLookupParent() {
1046  // FIXME: Find a better way to identify friends.
1047  if (isa<FunctionDecl>(this))
1048    if (getParent()->getRedeclContext()->isFileContext() &&
1049        getLexicalParent()->getRedeclContext()->isRecord())
1050      return getLexicalParent();
1051
1052  // A lookup within the call operator of a lambda never looks in the lambda
1053  // class; instead, skip to the context in which that closure type is
1054  // declared.
1055  if (isLambdaCallOperator(this))
1056    return getParent()->getParent();
1057
1058  return getParent();
1059}
1060
1061const BlockDecl *DeclContext::getInnermostBlockDecl() const {
1062  const DeclContext *Ctx = this;
1063
1064  do {
1065    if (Ctx->isClosure())
1066      return cast<BlockDecl>(Ctx);
1067    Ctx = Ctx->getParent();
1068  } while (Ctx);
1069
1070  return nullptr;
1071}
1072
1073bool DeclContext::isInlineNamespace() const {
1074  return isNamespace() &&
1075         cast<NamespaceDecl>(this)->isInline();
1076}
1077
1078bool DeclContext::isStdNamespace() const {
1079  if (!isNamespace())
1080    return false;
1081
1082  const auto *ND = cast<NamespaceDecl>(this);
1083  if (ND->isInline()) {
1084    return ND->getParent()->isStdNamespace();
1085  }
1086
1087  if (!getParent()->getRedeclContext()->isTranslationUnit())
1088    return false;
1089
1090  const IdentifierInfo *II = ND->getIdentifier();
1091  return II && II->isStr("std");
1092}
1093
1094bool DeclContext::isDependentContext() const {
1095  if (isFileContext())
1096    return false;
1097
1098  if (isa<ClassTemplatePartialSpecializationDecl>(this))
1099    return true;
1100
1101  if (const auto *Record = dyn_cast<CXXRecordDecl>(this)) {
1102    if (Record->getDescribedClassTemplate())
1103      return true;
1104
1105    if (Record->isDependentLambda())
1106      return true;
1107  }
1108
1109  if (const auto *Function = dyn_cast<FunctionDecl>(this)) {
1110    if (Function->getDescribedFunctionTemplate())
1111      return true;
1112
1113    // Friend function declarations are dependent if their *lexical*
1114    // context is dependent.
1115    if (cast<Decl>(this)->getFriendObjectKind())
1116      return getLexicalParent()->isDependentContext();
1117  }
1118
1119  // FIXME: A variable template is a dependent context, but is not a
1120  // DeclContext. A context within it (such as a lambda-expression)
1121  // should be considered dependent.
1122
1123  return getParent() && getParent()->isDependentContext();
1124}
1125
1126bool DeclContext::isTransparentContext() const {
1127  if (getDeclKind() == Decl::Enum)
1128    return !cast<EnumDecl>(this)->isScoped();
1129  else if (getDeclKind() == Decl::LinkageSpec || getDeclKind() == Decl::Export)
1130    return true;
1131
1132  return false;
1133}
1134
1135static bool isLinkageSpecContext(const DeclContext *DC,
1136                                 LinkageSpecDecl::LanguageIDs ID) {
1137  while (DC->getDeclKind() != Decl::TranslationUnit) {
1138    if (DC->getDeclKind() == Decl::LinkageSpec)
1139      return cast<LinkageSpecDecl>(DC)->getLanguage() == ID;
1140    DC = DC->getLexicalParent();
1141  }
1142  return false;
1143}
1144
1145bool DeclContext::isExternCContext() const {
1146  return isLinkageSpecContext(this, LinkageSpecDecl::lang_c);
1147}
1148
1149const LinkageSpecDecl *DeclContext::getExternCContext() const {
1150  const DeclContext *DC = this;
1151  while (DC->getDeclKind() != Decl::TranslationUnit) {
1152    if (DC->getDeclKind() == Decl::LinkageSpec &&
1153        cast<LinkageSpecDecl>(DC)->getLanguage() == LinkageSpecDecl::lang_c)
1154      return cast<LinkageSpecDecl>(DC);
1155    DC = DC->getLexicalParent();
1156  }
1157  return nullptr;
1158}
1159
1160bool DeclContext::isExternCXXContext() const {
1161  return isLinkageSpecContext(this, LinkageSpecDecl::lang_cxx);
1162}
1163
1164bool DeclContext::Encloses(const DeclContext *DC) const {
1165  if (getPrimaryContext() != this)
1166    return getPrimaryContext()->Encloses(DC);
1167
1168  for (; DC; DC = DC->getParent())
1169    if (DC->getPrimaryContext() == this)
1170      return true;
1171  return false;
1172}
1173
1174DeclContext *DeclContext::getPrimaryContext() {
1175  switch (getDeclKind()) {
1176  case Decl::TranslationUnit:
1177  case Decl::ExternCContext:
1178  case Decl::LinkageSpec:
1179  case Decl::Export:
1180  case Decl::Block:
1181  case Decl::Captured:
1182  case Decl::OMPDeclareReduction:
1183  case Decl::OMPDeclareMapper:
1184  case Decl::RequiresExprBody:
1185    // There is only one DeclContext for these entities.
1186    return this;
1187
1188  case Decl::Namespace:
1189    // The original namespace is our primary context.
1190    return static_cast<NamespaceDecl *>(this)->getOriginalNamespace();
1191
1192  case Decl::ObjCMethod:
1193    return this;
1194
1195  case Decl::ObjCInterface:
1196    if (auto *OID = dyn_cast<ObjCInterfaceDecl>(this))
1197      if (auto *Def = OID->getDefinition())
1198        return Def;
1199    return this;
1200
1201  case Decl::ObjCProtocol:
1202    if (auto *OPD = dyn_cast<ObjCProtocolDecl>(this))
1203      if (auto *Def = OPD->getDefinition())
1204        return Def;
1205    return this;
1206
1207  case Decl::ObjCCategory:
1208    return this;
1209
1210  case Decl::ObjCImplementation:
1211  case Decl::ObjCCategoryImpl:
1212    return this;
1213
1214  default:
1215    if (getDeclKind() >= Decl::firstTag && getDeclKind() <= Decl::lastTag) {
1216      // If this is a tag type that has a definition or is currently
1217      // being defined, that definition is our primary context.
1218      auto *Tag = cast<TagDecl>(this);
1219
1220      if (TagDecl *Def = Tag->getDefinition())
1221        return Def;
1222
1223      if (const auto *TagTy = dyn_cast<TagType>(Tag->getTypeForDecl())) {
1224        // Note, TagType::getDecl returns the (partial) definition one exists.
1225        TagDecl *PossiblePartialDef = TagTy->getDecl();
1226        if (PossiblePartialDef->isBeingDefined())
1227          return PossiblePartialDef;
1228      } else {
1229        assert(isa<InjectedClassNameType>(Tag->getTypeForDecl()));
1230      }
1231
1232      return Tag;
1233    }
1234
1235    assert(getDeclKind() >= Decl::firstFunction &&
1236           getDeclKind() <= Decl::lastFunction &&
1237          "Unknown DeclContext kind");
1238    return this;
1239  }
1240}
1241
1242void
1243DeclContext::collectAllContexts(SmallVectorImpl<DeclContext *> &Contexts){
1244  Contexts.clear();
1245
1246  if (getDeclKind() != Decl::Namespace) {
1247    Contexts.push_back(this);
1248    return;
1249  }
1250
1251  auto *Self = static_cast<NamespaceDecl *>(this);
1252  for (NamespaceDecl *N = Self->getMostRecentDecl(); N;
1253       N = N->getPreviousDecl())
1254    Contexts.push_back(N);
1255
1256  std::reverse(Contexts.begin(), Contexts.end());
1257}
1258
1259std::pair<Decl *, Decl *>
1260DeclContext::BuildDeclChain(ArrayRef<Decl *> Decls,
1261                            bool FieldsAlreadyLoaded) {
1262  // Build up a chain of declarations via the Decl::NextInContextAndBits field.
1263  Decl *FirstNewDecl = nullptr;
1264  Decl *PrevDecl = nullptr;
1265  for (auto *D : Decls) {
1266    if (FieldsAlreadyLoaded && isa<FieldDecl>(D))
1267      continue;
1268
1269    if (PrevDecl)
1270      PrevDecl->NextInContextAndBits.setPointer(D);
1271    else
1272      FirstNewDecl = D;
1273
1274    PrevDecl = D;
1275  }
1276
1277  return std::make_pair(FirstNewDecl, PrevDecl);
1278}
1279
1280/// We have just acquired external visible storage, and we already have
1281/// built a lookup map. For every name in the map, pull in the new names from
1282/// the external storage.
1283void DeclContext::reconcileExternalVisibleStorage() const {
1284  assert(hasNeedToReconcileExternalVisibleStorage() && LookupPtr);
1285  setNeedToReconcileExternalVisibleStorage(false);
1286
1287  for (auto &Lookup : *LookupPtr)
1288    Lookup.second.setHasExternalDecls();
1289}
1290
1291/// Load the declarations within this lexical storage from an
1292/// external source.
1293/// \return \c true if any declarations were added.
1294bool
1295DeclContext::LoadLexicalDeclsFromExternalStorage() const {
1296  ExternalASTSource *Source = getParentASTContext().getExternalSource();
1297  assert(hasExternalLexicalStorage() && Source && "No external storage?");
1298
1299  // Notify that we have a DeclContext that is initializing.
1300  ExternalASTSource::Deserializing ADeclContext(Source);
1301
1302  // Load the external declarations, if any.
1303  SmallVector<Decl*, 64> Decls;
1304  setHasExternalLexicalStorage(false);
1305  Source->FindExternalLexicalDecls(this, Decls);
1306
1307  if (Decls.empty())
1308    return false;
1309
1310  // We may have already loaded just the fields of this record, in which case
1311  // we need to ignore them.
1312  bool FieldsAlreadyLoaded = false;
1313  if (const auto *RD = dyn_cast<RecordDecl>(this))
1314    FieldsAlreadyLoaded = RD->hasLoadedFieldsFromExternalStorage();
1315
1316  // Splice the newly-read declarations into the beginning of the list
1317  // of declarations.
1318  Decl *ExternalFirst, *ExternalLast;
1319  std::tie(ExternalFirst, ExternalLast) =
1320      BuildDeclChain(Decls, FieldsAlreadyLoaded);
1321  ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
1322  FirstDecl = ExternalFirst;
1323  if (!LastDecl)
1324    LastDecl = ExternalLast;
1325  return true;
1326}
1327
1328DeclContext::lookup_result
1329ExternalASTSource::SetNoExternalVisibleDeclsForName(const DeclContext *DC,
1330                                                    DeclarationName Name) {
1331  ASTContext &Context = DC->getParentASTContext();
1332  StoredDeclsMap *Map;
1333  if (!(Map = DC->LookupPtr))
1334    Map = DC->CreateStoredDeclsMap(Context);
1335  if (DC->hasNeedToReconcileExternalVisibleStorage())
1336    DC->reconcileExternalVisibleStorage();
1337
1338  (*Map)[Name].removeExternalDecls();
1339
1340  return DeclContext::lookup_result();
1341}
1342
1343DeclContext::lookup_result
1344ExternalASTSource::SetExternalVisibleDeclsForName(const DeclContext *DC,
1345                                                  DeclarationName Name,
1346                                                  ArrayRef<NamedDecl*> Decls) {
1347  ASTContext &Context = DC->getParentASTContext();
1348  StoredDeclsMap *Map;
1349  if (!(Map = DC->LookupPtr))
1350    Map = DC->CreateStoredDeclsMap(Context);
1351  if (DC->hasNeedToReconcileExternalVisibleStorage())
1352    DC->reconcileExternalVisibleStorage();
1353
1354  StoredDeclsList &List = (*Map)[Name];
1355
1356  // Clear out any old external visible declarations, to avoid quadratic
1357  // performance in the redeclaration checks below.
1358  List.removeExternalDecls();
1359
1360  if (!List.isNull()) {
1361    // We have both existing declarations and new declarations for this name.
1362    // Some of the declarations may simply replace existing ones. Handle those
1363    // first.
1364    llvm::SmallVector<unsigned, 8> Skip;
1365    for (unsigned I = 0, N = Decls.size(); I != N; ++I)
1366      if (List.HandleRedeclaration(Decls[I], /*IsKnownNewer*/false))
1367        Skip.push_back(I);
1368    Skip.push_back(Decls.size());
1369
1370    // Add in any new declarations.
1371    unsigned SkipPos = 0;
1372    for (unsigned I = 0, N = Decls.size(); I != N; ++I) {
1373      if (I == Skip[SkipPos])
1374        ++SkipPos;
1375      else
1376        List.AddSubsequentDecl(Decls[I]);
1377    }
1378  } else {
1379    // Convert the array to a StoredDeclsList.
1380    for (auto *D : Decls) {
1381      if (List.isNull())
1382        List.setOnlyValue(D);
1383      else
1384        List.AddSubsequentDecl(D);
1385    }
1386  }
1387
1388  return List.getLookupResult();
1389}
1390
1391DeclContext::decl_iterator DeclContext::decls_begin() const {
1392  if (hasExternalLexicalStorage())
1393    LoadLexicalDeclsFromExternalStorage();
1394  return decl_iterator(FirstDecl);
1395}
1396
1397bool DeclContext::decls_empty() const {
1398  if (hasExternalLexicalStorage())
1399    LoadLexicalDeclsFromExternalStorage();
1400
1401  return !FirstDecl;
1402}
1403
1404bool DeclContext::containsDecl(Decl *D) const {
1405  return (D->getLexicalDeclContext() == this &&
1406          (D->NextInContextAndBits.getPointer() || D == LastDecl));
1407}
1408
1409bool DeclContext::containsDeclAndLoad(Decl *D) const {
1410  if (hasExternalLexicalStorage())
1411    LoadLexicalDeclsFromExternalStorage();
1412  return containsDecl(D);
1413}
1414
1415/// shouldBeHidden - Determine whether a declaration which was declared
1416/// within its semantic context should be invisible to qualified name lookup.
1417static bool shouldBeHidden(NamedDecl *D) {
1418  // Skip unnamed declarations.
1419  if (!D->getDeclName())
1420    return true;
1421
1422  // Skip entities that can't be found by name lookup into a particular
1423  // context.
1424  if ((D->getIdentifierNamespace() == 0 && !isa<UsingDirectiveDecl>(D)) ||
1425      D->isTemplateParameter())
1426    return true;
1427
1428  // Skip friends and local extern declarations unless they're the first
1429  // declaration of the entity.
1430  if ((D->isLocalExternDecl() || D->getFriendObjectKind()) &&
1431      D != D->getCanonicalDecl())
1432    return true;
1433
1434  // Skip template specializations.
1435  // FIXME: This feels like a hack. Should DeclarationName support
1436  // template-ids, or is there a better way to keep specializations
1437  // from being visible?
1438  if (isa<ClassTemplateSpecializationDecl>(D))
1439    return true;
1440  if (auto *FD = dyn_cast<FunctionDecl>(D))
1441    if (FD->isFunctionTemplateSpecialization())
1442      return true;
1443
1444  return false;
1445}
1446
1447void DeclContext::removeDecl(Decl *D) {
1448  assert(D->getLexicalDeclContext() == this &&
1449         "decl being removed from non-lexical context");
1450  assert((D->NextInContextAndBits.getPointer() || D == LastDecl) &&
1451         "decl is not in decls list");
1452
1453  // Remove D from the decl chain.  This is O(n) but hopefully rare.
1454  if (D == FirstDecl) {
1455    if (D == LastDecl)
1456      FirstDecl = LastDecl = nullptr;
1457    else
1458      FirstDecl = D->NextInContextAndBits.getPointer();
1459  } else {
1460    for (Decl *I = FirstDecl; true; I = I->NextInContextAndBits.getPointer()) {
1461      assert(I && "decl not found in linked list");
1462      if (I->NextInContextAndBits.getPointer() == D) {
1463        I->NextInContextAndBits.setPointer(D->NextInContextAndBits.getPointer());
1464        if (D == LastDecl) LastDecl = I;
1465        break;
1466      }
1467    }
1468  }
1469
1470  // Mark that D is no longer in the decl chain.
1471  D->NextInContextAndBits.setPointer(nullptr);
1472
1473  // Remove D from the lookup table if necessary.
1474  if (isa<NamedDecl>(D)) {
1475    auto *ND = cast<NamedDecl>(D);
1476
1477    // Do not try to remove the declaration if that is invisible to qualified
1478    // lookup.  E.g. template specializations are skipped.
1479    if (shouldBeHidden(ND))
1480      return;
1481
1482    // Remove only decls that have a name
1483    if (!ND->getDeclName())
1484      return;
1485
1486    auto *DC = D->getDeclContext();
1487    do {
1488      StoredDeclsMap *Map = DC->getPrimaryContext()->LookupPtr;
1489      if (Map) {
1490        StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1491        assert(Pos != Map->end() && "no lookup entry for decl");
1492        // Remove the decl only if it is contained.
1493        StoredDeclsList::DeclsTy *Vec = Pos->second.getAsVector();
1494        if ((Vec && is_contained(*Vec, ND)) || Pos->second.getAsDecl() == ND)
1495          Pos->second.remove(ND);
1496      }
1497    } while (DC->isTransparentContext() && (DC = DC->getParent()));
1498  }
1499}
1500
1501void DeclContext::addHiddenDecl(Decl *D) {
1502  assert(D->getLexicalDeclContext() == this &&
1503         "Decl inserted into wrong lexical context");
1504  assert(!D->getNextDeclInContext() && D != LastDecl &&
1505         "Decl already inserted into a DeclContext");
1506
1507  if (FirstDecl) {
1508    LastDecl->NextInContextAndBits.setPointer(D);
1509    LastDecl = D;
1510  } else {
1511    FirstDecl = LastDecl = D;
1512  }
1513
1514  // Notify a C++ record declaration that we've added a member, so it can
1515  // update its class-specific state.
1516  if (auto *Record = dyn_cast<CXXRecordDecl>(this))
1517    Record->addedMember(D);
1518
1519  // If this is a newly-created (not de-serialized) import declaration, wire
1520  // it in to the list of local import declarations.
1521  if (!D->isFromASTFile()) {
1522    if (auto *Import = dyn_cast<ImportDecl>(D))
1523      D->getASTContext().addedLocalImportDecl(Import);
1524  }
1525}
1526
1527void DeclContext::addDecl(Decl *D) {
1528  addHiddenDecl(D);
1529
1530  if (auto *ND = dyn_cast<NamedDecl>(D))
1531    ND->getDeclContext()->getPrimaryContext()->
1532        makeDeclVisibleInContextWithFlags(ND, false, true);
1533}
1534
1535void DeclContext::addDeclInternal(Decl *D) {
1536  addHiddenDecl(D);
1537
1538  if (auto *ND = dyn_cast<NamedDecl>(D))
1539    ND->getDeclContext()->getPrimaryContext()->
1540        makeDeclVisibleInContextWithFlags(ND, true, true);
1541}
1542
1543/// buildLookup - Build the lookup data structure with all of the
1544/// declarations in this DeclContext (and any other contexts linked
1545/// to it or transparent contexts nested within it) and return it.
1546///
1547/// Note that the produced map may miss out declarations from an
1548/// external source. If it does, those entries will be marked with
1549/// the 'hasExternalDecls' flag.
1550StoredDeclsMap *DeclContext::buildLookup() {
1551  assert(this == getPrimaryContext() && "buildLookup called on non-primary DC");
1552
1553  if (!hasLazyLocalLexicalLookups() &&
1554      !hasLazyExternalLexicalLookups())
1555    return LookupPtr;
1556
1557  SmallVector<DeclContext *, 2> Contexts;
1558  collectAllContexts(Contexts);
1559
1560  if (hasLazyExternalLexicalLookups()) {
1561    setHasLazyExternalLexicalLookups(false);
1562    for (auto *DC : Contexts) {
1563      if (DC->hasExternalLexicalStorage()) {
1564        bool LoadedDecls = DC->LoadLexicalDeclsFromExternalStorage();
1565        setHasLazyLocalLexicalLookups(
1566            hasLazyLocalLexicalLookups() | LoadedDecls );
1567      }
1568    }
1569
1570    if (!hasLazyLocalLexicalLookups())
1571      return LookupPtr;
1572  }
1573
1574  for (auto *DC : Contexts)
1575    buildLookupImpl(DC, hasExternalVisibleStorage());
1576
1577  // We no longer have any lazy decls.
1578  setHasLazyLocalLexicalLookups(false);
1579  return LookupPtr;
1580}
1581
1582/// buildLookupImpl - Build part of the lookup data structure for the
1583/// declarations contained within DCtx, which will either be this
1584/// DeclContext, a DeclContext linked to it, or a transparent context
1585/// nested within it.
1586void DeclContext::buildLookupImpl(DeclContext *DCtx, bool Internal) {
1587  for (auto *D : DCtx->noload_decls()) {
1588    // Insert this declaration into the lookup structure, but only if
1589    // it's semantically within its decl context. Any other decls which
1590    // should be found in this context are added eagerly.
1591    //
1592    // If it's from an AST file, don't add it now. It'll get handled by
1593    // FindExternalVisibleDeclsByName if needed. Exception: if we're not
1594    // in C++, we do not track external visible decls for the TU, so in
1595    // that case we need to collect them all here.
1596    if (auto *ND = dyn_cast<NamedDecl>(D))
1597      if (ND->getDeclContext() == DCtx && !shouldBeHidden(ND) &&
1598          (!ND->isFromASTFile() ||
1599           (isTranslationUnit() &&
1600            !getParentASTContext().getLangOpts().CPlusPlus)))
1601        makeDeclVisibleInContextImpl(ND, Internal);
1602
1603    // If this declaration is itself a transparent declaration context
1604    // or inline namespace, add the members of this declaration of that
1605    // context (recursively).
1606    if (auto *InnerCtx = dyn_cast<DeclContext>(D))
1607      if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1608        buildLookupImpl(InnerCtx, Internal);
1609  }
1610}
1611
1612NamedDecl *const DeclContextLookupResult::SingleElementDummyList = nullptr;
1613
1614DeclContext::lookup_result
1615DeclContext::lookup(DeclarationName Name) const {
1616  assert(getDeclKind() != Decl::LinkageSpec &&
1617         getDeclKind() != Decl::Export &&
1618         "should not perform lookups into transparent contexts");
1619
1620  const DeclContext *PrimaryContext = getPrimaryContext();
1621  if (PrimaryContext != this)
1622    return PrimaryContext->lookup(Name);
1623
1624  // If we have an external source, ensure that any later redeclarations of this
1625  // context have been loaded, since they may add names to the result of this
1626  // lookup (or add external visible storage).
1627  ExternalASTSource *Source = getParentASTContext().getExternalSource();
1628  if (Source)
1629    (void)cast<Decl>(this)->getMostRecentDecl();
1630
1631  if (hasExternalVisibleStorage()) {
1632    assert(Source && "external visible storage but no external source?");
1633
1634    if (hasNeedToReconcileExternalVisibleStorage())
1635      reconcileExternalVisibleStorage();
1636
1637    StoredDeclsMap *Map = LookupPtr;
1638
1639    if (hasLazyLocalLexicalLookups() ||
1640        hasLazyExternalLexicalLookups())
1641      // FIXME: Make buildLookup const?
1642      Map = const_cast<DeclContext*>(this)->buildLookup();
1643
1644    if (!Map)
1645      Map = CreateStoredDeclsMap(getParentASTContext());
1646
1647    // If we have a lookup result with no external decls, we are done.
1648    std::pair<StoredDeclsMap::iterator, bool> R =
1649        Map->insert(std::make_pair(Name, StoredDeclsList()));
1650    if (!R.second && !R.first->second.hasExternalDecls())
1651      return R.first->second.getLookupResult();
1652
1653    if (Source->FindExternalVisibleDeclsByName(this, Name) || !R.second) {
1654      if (StoredDeclsMap *Map = LookupPtr) {
1655        StoredDeclsMap::iterator I = Map->find(Name);
1656        if (I != Map->end())
1657          return I->second.getLookupResult();
1658      }
1659    }
1660
1661    return {};
1662  }
1663
1664  StoredDeclsMap *Map = LookupPtr;
1665  if (hasLazyLocalLexicalLookups() ||
1666      hasLazyExternalLexicalLookups())
1667    Map = const_cast<DeclContext*>(this)->buildLookup();
1668
1669  if (!Map)
1670    return {};
1671
1672  StoredDeclsMap::iterator I = Map->find(Name);
1673  if (I == Map->end())
1674    return {};
1675
1676  return I->second.getLookupResult();
1677}
1678
1679DeclContext::lookup_result
1680DeclContext::noload_lookup(DeclarationName Name) {
1681  assert(getDeclKind() != Decl::LinkageSpec &&
1682         getDeclKind() != Decl::Export &&
1683         "should not perform lookups into transparent contexts");
1684
1685  DeclContext *PrimaryContext = getPrimaryContext();
1686  if (PrimaryContext != this)
1687    return PrimaryContext->noload_lookup(Name);
1688
1689  loadLazyLocalLexicalLookups();
1690  StoredDeclsMap *Map = LookupPtr;
1691  if (!Map)
1692    return {};
1693
1694  StoredDeclsMap::iterator I = Map->find(Name);
1695  return I != Map->end() ? I->second.getLookupResult()
1696                         : lookup_result();
1697}
1698
1699// If we have any lazy lexical declarations not in our lookup map, add them
1700// now. Don't import any external declarations, not even if we know we have
1701// some missing from the external visible lookups.
1702void DeclContext::loadLazyLocalLexicalLookups() {
1703  if (hasLazyLocalLexicalLookups()) {
1704    SmallVector<DeclContext *, 2> Contexts;
1705    collectAllContexts(Contexts);
1706    for (auto *Context : Contexts)
1707      buildLookupImpl(Context, hasExternalVisibleStorage());
1708    setHasLazyLocalLexicalLookups(false);
1709  }
1710}
1711
1712void DeclContext::localUncachedLookup(DeclarationName Name,
1713                                      SmallVectorImpl<NamedDecl *> &Results) {
1714  Results.clear();
1715
1716  // If there's no external storage, just perform a normal lookup and copy
1717  // the results.
1718  if (!hasExternalVisibleStorage() && !hasExternalLexicalStorage() && Name) {
1719    lookup_result LookupResults = lookup(Name);
1720    Results.insert(Results.end(), LookupResults.begin(), LookupResults.end());
1721    return;
1722  }
1723
1724  // If we have a lookup table, check there first. Maybe we'll get lucky.
1725  // FIXME: Should we be checking these flags on the primary context?
1726  if (Name && !hasLazyLocalLexicalLookups() &&
1727      !hasLazyExternalLexicalLookups()) {
1728    if (StoredDeclsMap *Map = LookupPtr) {
1729      StoredDeclsMap::iterator Pos = Map->find(Name);
1730      if (Pos != Map->end()) {
1731        Results.insert(Results.end(),
1732                       Pos->second.getLookupResult().begin(),
1733                       Pos->second.getLookupResult().end());
1734        return;
1735      }
1736    }
1737  }
1738
1739  // Slow case: grovel through the declarations in our chain looking for
1740  // matches.
1741  // FIXME: If we have lazy external declarations, this will not find them!
1742  // FIXME: Should we CollectAllContexts and walk them all here?
1743  for (Decl *D = FirstDecl; D; D = D->getNextDeclInContext()) {
1744    if (auto *ND = dyn_cast<NamedDecl>(D))
1745      if (ND->getDeclName() == Name)
1746        Results.push_back(ND);
1747  }
1748}
1749
1750DeclContext *DeclContext::getRedeclContext() {
1751  DeclContext *Ctx = this;
1752
1753  // In C, a record type is the redeclaration context for its fields only. If
1754  // we arrive at a record context after skipping anything else, we should skip
1755  // the record as well. Currently, this means skipping enumerations because
1756  // they're the only transparent context that can exist within a struct or
1757  // union.
1758  bool SkipRecords = getDeclKind() == Decl::Kind::Enum &&
1759                     !getParentASTContext().getLangOpts().CPlusPlus;
1760
1761  // Skip through contexts to get to the redeclaration context. Transparent
1762  // contexts are always skipped.
1763  while ((SkipRecords && Ctx->isRecord()) || Ctx->isTransparentContext())
1764    Ctx = Ctx->getParent();
1765  return Ctx;
1766}
1767
1768DeclContext *DeclContext::getEnclosingNamespaceContext() {
1769  DeclContext *Ctx = this;
1770  // Skip through non-namespace, non-translation-unit contexts.
1771  while (!Ctx->isFileContext())
1772    Ctx = Ctx->getParent();
1773  return Ctx->getPrimaryContext();
1774}
1775
1776RecordDecl *DeclContext::getOuterLexicalRecordContext() {
1777  // Loop until we find a non-record context.
1778  RecordDecl *OutermostRD = nullptr;
1779  DeclContext *DC = this;
1780  while (DC->isRecord()) {
1781    OutermostRD = cast<RecordDecl>(DC);
1782    DC = DC->getLexicalParent();
1783  }
1784  return OutermostRD;
1785}
1786
1787bool DeclContext::InEnclosingNamespaceSetOf(const DeclContext *O) const {
1788  // For non-file contexts, this is equivalent to Equals.
1789  if (!isFileContext())
1790    return O->Equals(this);
1791
1792  do {
1793    if (O->Equals(this))
1794      return true;
1795
1796    const auto *NS = dyn_cast<NamespaceDecl>(O);
1797    if (!NS || !NS->isInline())
1798      break;
1799    O = NS->getParent();
1800  } while (O);
1801
1802  return false;
1803}
1804
1805void DeclContext::makeDeclVisibleInContext(NamedDecl *D) {
1806  DeclContext *PrimaryDC = this->getPrimaryContext();
1807  DeclContext *DeclDC = D->getDeclContext()->getPrimaryContext();
1808  // If the decl is being added outside of its semantic decl context, we
1809  // need to ensure that we eagerly build the lookup information for it.
1810  PrimaryDC->makeDeclVisibleInContextWithFlags(D, false, PrimaryDC == DeclDC);
1811}
1812
1813void DeclContext::makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal,
1814                                                    bool Recoverable) {
1815  assert(this == getPrimaryContext() && "expected a primary DC");
1816
1817  if (!isLookupContext()) {
1818    if (isTransparentContext())
1819      getParent()->getPrimaryContext()
1820        ->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
1821    return;
1822  }
1823
1824  // Skip declarations which should be invisible to name lookup.
1825  if (shouldBeHidden(D))
1826    return;
1827
1828  // If we already have a lookup data structure, perform the insertion into
1829  // it. If we might have externally-stored decls with this name, look them
1830  // up and perform the insertion. If this decl was declared outside its
1831  // semantic context, buildLookup won't add it, so add it now.
1832  //
1833  // FIXME: As a performance hack, don't add such decls into the translation
1834  // unit unless we're in C++, since qualified lookup into the TU is never
1835  // performed.
1836  if (LookupPtr || hasExternalVisibleStorage() ||
1837      ((!Recoverable || D->getDeclContext() != D->getLexicalDeclContext()) &&
1838       (getParentASTContext().getLangOpts().CPlusPlus ||
1839        !isTranslationUnit()))) {
1840    // If we have lazily omitted any decls, they might have the same name as
1841    // the decl which we are adding, so build a full lookup table before adding
1842    // this decl.
1843    buildLookup();
1844    makeDeclVisibleInContextImpl(D, Internal);
1845  } else {
1846    setHasLazyLocalLexicalLookups(true);
1847  }
1848
1849  // If we are a transparent context or inline namespace, insert into our
1850  // parent context, too. This operation is recursive.
1851  if (isTransparentContext() || isInlineNamespace())
1852    getParent()->getPrimaryContext()->
1853        makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
1854
1855  auto *DCAsDecl = cast<Decl>(this);
1856  // Notify that a decl was made visible unless we are a Tag being defined.
1857  if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
1858    if (ASTMutationListener *L = DCAsDecl->getASTMutationListener())
1859      L->AddedVisibleDecl(this, D);
1860}
1861
1862void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) {
1863  // Find or create the stored declaration map.
1864  StoredDeclsMap *Map = LookupPtr;
1865  if (!Map) {
1866    ASTContext *C = &getParentASTContext();
1867    Map = CreateStoredDeclsMap(*C);
1868  }
1869
1870  // If there is an external AST source, load any declarations it knows about
1871  // with this declaration's name.
1872  // If the lookup table contains an entry about this name it means that we
1873  // have already checked the external source.
1874  if (!Internal)
1875    if (ExternalASTSource *Source = getParentASTContext().getExternalSource())
1876      if (hasExternalVisibleStorage() &&
1877          Map->find(D->getDeclName()) == Map->end())
1878        Source->FindExternalVisibleDeclsByName(this, D->getDeclName());
1879
1880  // Insert this declaration into the map.
1881  StoredDeclsList &DeclNameEntries = (*Map)[D->getDeclName()];
1882
1883  if (Internal) {
1884    // If this is being added as part of loading an external declaration,
1885    // this may not be the only external declaration with this name.
1886    // In this case, we never try to replace an existing declaration; we'll
1887    // handle that when we finalize the list of declarations for this name.
1888    DeclNameEntries.setHasExternalDecls();
1889    DeclNameEntries.AddSubsequentDecl(D);
1890    return;
1891  }
1892
1893  if (DeclNameEntries.isNull()) {
1894    DeclNameEntries.setOnlyValue(D);
1895    return;
1896  }
1897
1898  if (DeclNameEntries.HandleRedeclaration(D, /*IsKnownNewer*/!Internal)) {
1899    // This declaration has replaced an existing one for which
1900    // declarationReplaces returns true.
1901    return;
1902  }
1903
1904  // Put this declaration into the appropriate slot.
1905  DeclNameEntries.AddSubsequentDecl(D);
1906}
1907
1908UsingDirectiveDecl *DeclContext::udir_iterator::operator*() const {
1909  return cast<UsingDirectiveDecl>(*I);
1910}
1911
1912/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within
1913/// this context.
1914DeclContext::udir_range DeclContext::using_directives() const {
1915  // FIXME: Use something more efficient than normal lookup for using
1916  // directives. In C++, using directives are looked up more than anything else.
1917  lookup_result Result = lookup(UsingDirectiveDecl::getName());
1918  return udir_range(Result.begin(), Result.end());
1919}
1920
1921//===----------------------------------------------------------------------===//
1922// Creation and Destruction of StoredDeclsMaps.                               //
1923//===----------------------------------------------------------------------===//
1924
1925StoredDeclsMap *DeclContext::CreateStoredDeclsMap(ASTContext &C) const {
1926  assert(!LookupPtr && "context already has a decls map");
1927  assert(getPrimaryContext() == this &&
1928         "creating decls map on non-primary context");
1929
1930  StoredDeclsMap *M;
1931  bool Dependent = isDependentContext();
1932  if (Dependent)
1933    M = new DependentStoredDeclsMap();
1934  else
1935    M = new StoredDeclsMap();
1936  M->Previous = C.LastSDM;
1937  C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M, Dependent);
1938  LookupPtr = M;
1939  return M;
1940}
1941
1942void ASTContext::ReleaseDeclContextMaps() {
1943  // It's okay to delete DependentStoredDeclsMaps via a StoredDeclsMap
1944  // pointer because the subclass doesn't add anything that needs to
1945  // be deleted.
1946  StoredDeclsMap::DestroyAll(LastSDM.getPointer(), LastSDM.getInt());
1947}
1948
1949void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) {
1950  while (Map) {
1951    // Advance the iteration before we invalidate memory.
1952    llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
1953
1954    if (Dependent)
1955      delete static_cast<DependentStoredDeclsMap*>(Map);
1956    else
1957      delete Map;
1958
1959    Map = Next.getPointer();
1960    Dependent = Next.getInt();
1961  }
1962}
1963
1964DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C,
1965                                                 DeclContext *Parent,
1966                                           const PartialDiagnostic &PDiag) {
1967  assert(Parent->isDependentContext()
1968         && "cannot iterate dependent diagnostics of non-dependent context");
1969  Parent = Parent->getPrimaryContext();
1970  if (!Parent->LookupPtr)
1971    Parent->CreateStoredDeclsMap(C);
1972
1973  auto *Map = static_cast<DependentStoredDeclsMap *>(Parent->LookupPtr);
1974
1975  // Allocate the copy of the PartialDiagnostic via the ASTContext's
1976  // BumpPtrAllocator, rather than the ASTContext itself.
1977  PartialDiagnostic::Storage *DiagStorage = nullptr;
1978  if (PDiag.hasStorage())
1979    DiagStorage = new (C) PartialDiagnostic::Storage;
1980
1981  auto *DD = new (C) DependentDiagnostic(PDiag, DiagStorage);
1982
1983  // TODO: Maybe we shouldn't reverse the order during insertion.
1984  DD->NextDiagnostic = Map->FirstDiagnostic;
1985  Map->FirstDiagnostic = DD;
1986
1987  return DD;
1988}
1989