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