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/Decl.h"
16 #include "clang/AST/DeclContextInternals.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclFriend.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/DependentDiagnostic.h"
22 #include "clang/AST/ExternalASTSource.h"
23 #include "clang/AST/ASTContext.h"
24 #include "clang/AST/Type.h"
25 #include "clang/AST/Stmt.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/ASTMutationListener.h"
28 #include "clang/Basic/TargetInfo.h"
29 #include "llvm/ADT/DenseMap.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include <algorithm>
32 using namespace clang;
33 
34 //===----------------------------------------------------------------------===//
35 //  Statistics
36 //===----------------------------------------------------------------------===//
37 
38 #define DECL(DERIVED, BASE) static int n##DERIVED##s = 0;
39 #define ABSTRACT_DECL(DECL)
40 #include "clang/AST/DeclNodes.inc"
41 
42 static bool StatSwitch = false;
43 
44 void *Decl::AllocateDeserializedDecl(const ASTContext &Context,
45                                      unsigned ID,
46                                      unsigned Size) {
47   // Allocate an extra 8 bytes worth of storage, which ensures that the
48   // resulting pointer will still be 8-byte aligned.
49   void *Start = Context.Allocate(Size + 8);
50   void *Result = (char*)Start + 8;
51 
52   unsigned *PrefixPtr = (unsigned *)Result - 2;
53 
54   // Zero out the first 4 bytes; this is used to store the owning module ID.
55   PrefixPtr[0] = 0;
56 
57   // Store the global declaration ID in the second 4 bytes.
58   PrefixPtr[1] = ID;
59 
60   return Result;
61 }
62 
63 const char *Decl::getDeclKindName() const {
64   switch (DeclKind) {
65   default: llvm_unreachable("Declaration not in DeclNodes.inc!");
66 #define DECL(DERIVED, BASE) case DERIVED: return #DERIVED;
67 #define ABSTRACT_DECL(DECL)
68 #include "clang/AST/DeclNodes.inc"
69   }
70 }
71 
72 void Decl::setInvalidDecl(bool Invalid) {
73   InvalidDecl = Invalid;
74   if (Invalid) {
75     // Defensive maneuver for ill-formed code: we're likely not to make it to
76     // a point where we set the access specifier, so default it to "public"
77     // to avoid triggering asserts elsewhere in the front end.
78     setAccess(AS_public);
79   }
80 }
81 
82 const char *DeclContext::getDeclKindName() const {
83   switch (DeclKind) {
84   default: llvm_unreachable("Declaration context not in DeclNodes.inc!");
85 #define DECL(DERIVED, BASE) case Decl::DERIVED: return #DERIVED;
86 #define ABSTRACT_DECL(DECL)
87 #include "clang/AST/DeclNodes.inc"
88   }
89 }
90 
91 bool Decl::CollectingStats(bool Enable) {
92   if (Enable) StatSwitch = true;
93   return StatSwitch;
94 }
95 
96 void Decl::PrintStats() {
97   llvm::errs() << "\n*** Decl Stats:\n";
98 
99   int totalDecls = 0;
100 #define DECL(DERIVED, BASE) totalDecls += n##DERIVED##s;
101 #define ABSTRACT_DECL(DECL)
102 #include "clang/AST/DeclNodes.inc"
103   llvm::errs() << "  " << totalDecls << " decls total.\n";
104 
105   int totalBytes = 0;
106 #define DECL(DERIVED, BASE)                                             \
107   if (n##DERIVED##s > 0) {                                              \
108     totalBytes += (int)(n##DERIVED##s * sizeof(DERIVED##Decl));         \
109     llvm::errs() << "    " << n##DERIVED##s << " " #DERIVED " decls, "  \
110                  << sizeof(DERIVED##Decl) << " each ("                  \
111                  << n##DERIVED##s * sizeof(DERIVED##Decl)               \
112                  << " bytes)\n";                                        \
113   }
114 #define ABSTRACT_DECL(DECL)
115 #include "clang/AST/DeclNodes.inc"
116 
117   llvm::errs() << "Total bytes = " << totalBytes << "\n";
118 }
119 
120 void Decl::add(Kind k) {
121   switch (k) {
122 #define DECL(DERIVED, BASE) case DERIVED: ++n##DERIVED##s; break;
123 #define ABSTRACT_DECL(DECL)
124 #include "clang/AST/DeclNodes.inc"
125   }
126 }
127 
128 bool Decl::isTemplateParameterPack() const {
129   if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(this))
130     return TTP->isParameterPack();
131   if (const NonTypeTemplateParmDecl *NTTP
132                                 = dyn_cast<NonTypeTemplateParmDecl>(this))
133     return NTTP->isParameterPack();
134   if (const TemplateTemplateParmDecl *TTP
135                                     = dyn_cast<TemplateTemplateParmDecl>(this))
136     return TTP->isParameterPack();
137   return false;
138 }
139 
140 bool Decl::isParameterPack() const {
141   if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(this))
142     return Parm->isParameterPack();
143 
144   return isTemplateParameterPack();
145 }
146 
147 bool Decl::isFunctionOrFunctionTemplate() const {
148   if (const UsingShadowDecl *UD = dyn_cast<UsingShadowDecl>(this))
149     return UD->getTargetDecl()->isFunctionOrFunctionTemplate();
150 
151   return isa<FunctionDecl>(this) || isa<FunctionTemplateDecl>(this);
152 }
153 
154 bool Decl::isTemplateDecl() const {
155   return isa<TemplateDecl>(this);
156 }
157 
158 const DeclContext *Decl::getParentFunctionOrMethod() const {
159   for (const DeclContext *DC = getDeclContext();
160        DC && !DC->isTranslationUnit() && !DC->isNamespace();
161        DC = DC->getParent())
162     if (DC->isFunctionOrMethod())
163       return DC;
164 
165   return 0;
166 }
167 
168 
169 //===----------------------------------------------------------------------===//
170 // PrettyStackTraceDecl Implementation
171 //===----------------------------------------------------------------------===//
172 
173 void PrettyStackTraceDecl::print(raw_ostream &OS) const {
174   SourceLocation TheLoc = Loc;
175   if (TheLoc.isInvalid() && TheDecl)
176     TheLoc = TheDecl->getLocation();
177 
178   if (TheLoc.isValid()) {
179     TheLoc.print(OS, SM);
180     OS << ": ";
181   }
182 
183   OS << Message;
184 
185   if (const NamedDecl *DN = dyn_cast_or_null<NamedDecl>(TheDecl))
186     OS << " '" << DN->getQualifiedNameAsString() << '\'';
187   OS << '\n';
188 }
189 
190 //===----------------------------------------------------------------------===//
191 // Decl Implementation
192 //===----------------------------------------------------------------------===//
193 
194 // Out-of-line virtual method providing a home for Decl.
195 Decl::~Decl() { }
196 
197 void Decl::setDeclContext(DeclContext *DC) {
198   DeclCtx = DC;
199 }
200 
201 void Decl::setLexicalDeclContext(DeclContext *DC) {
202   if (DC == getLexicalDeclContext())
203     return;
204 
205   if (isInSemaDC()) {
206     setDeclContextsImpl(getDeclContext(), DC, getASTContext());
207   } else {
208     getMultipleDC()->LexicalDC = DC;
209   }
210 }
211 
212 void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
213                                ASTContext &Ctx) {
214   if (SemaDC == LexicalDC) {
215     DeclCtx = SemaDC;
216   } else {
217     Decl::MultipleDC *MDC = new (Ctx) Decl::MultipleDC();
218     MDC->SemanticDC = SemaDC;
219     MDC->LexicalDC = LexicalDC;
220     DeclCtx = MDC;
221   }
222 }
223 
224 bool Decl::isInAnonymousNamespace() const {
225   const DeclContext *DC = getDeclContext();
226   do {
227     if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC))
228       if (ND->isAnonymousNamespace())
229         return true;
230   } while ((DC = DC->getParent()));
231 
232   return false;
233 }
234 
235 TranslationUnitDecl *Decl::getTranslationUnitDecl() {
236   if (TranslationUnitDecl *TUD = dyn_cast<TranslationUnitDecl>(this))
237     return TUD;
238 
239   DeclContext *DC = getDeclContext();
240   assert(DC && "This decl is not contained in a translation unit!");
241 
242   while (!DC->isTranslationUnit()) {
243     DC = DC->getParent();
244     assert(DC && "This decl is not contained in a translation unit!");
245   }
246 
247   return cast<TranslationUnitDecl>(DC);
248 }
249 
250 ASTContext &Decl::getASTContext() const {
251   return getTranslationUnitDecl()->getASTContext();
252 }
253 
254 ASTMutationListener *Decl::getASTMutationListener() const {
255   return getASTContext().getASTMutationListener();
256 }
257 
258 bool Decl::isUsed(bool CheckUsedAttr) const {
259   if (Used)
260     return true;
261 
262   // Check for used attribute.
263   if (CheckUsedAttr && hasAttr<UsedAttr>())
264     return true;
265 
266   // Check redeclarations for used attribute.
267   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
268     if ((CheckUsedAttr && I->hasAttr<UsedAttr>()) || I->Used)
269       return true;
270   }
271 
272   return false;
273 }
274 
275 bool Decl::isReferenced() const {
276   if (Referenced)
277     return true;
278 
279   // Check redeclarations.
280   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I)
281     if (I->Referenced)
282       return true;
283 
284   return false;
285 }
286 
287 /// \brief Determine the availability of the given declaration based on
288 /// the target platform.
289 ///
290 /// When it returns an availability result other than \c AR_Available,
291 /// if the \p Message parameter is non-NULL, it will be set to a
292 /// string describing why the entity is unavailable.
293 ///
294 /// FIXME: Make these strings localizable, since they end up in
295 /// diagnostics.
296 static AvailabilityResult CheckAvailability(ASTContext &Context,
297                                             const AvailabilityAttr *A,
298                                             std::string *Message) {
299   StringRef TargetPlatform = Context.getTargetInfo().getPlatformName();
300   StringRef PrettyPlatformName
301     = AvailabilityAttr::getPrettyPlatformName(TargetPlatform);
302   if (PrettyPlatformName.empty())
303     PrettyPlatformName = TargetPlatform;
304 
305   VersionTuple TargetMinVersion = Context.getTargetInfo().getPlatformMinVersion();
306   if (TargetMinVersion.empty())
307     return AR_Available;
308 
309   // Match the platform name.
310   if (A->getPlatform()->getName() != TargetPlatform)
311     return AR_Available;
312 
313   std::string HintMessage;
314   if (!A->getMessage().empty()) {
315     HintMessage = " - ";
316     HintMessage += A->getMessage();
317   }
318 
319   // Make sure that this declaration has not been marked 'unavailable'.
320   if (A->getUnavailable()) {
321     if (Message) {
322       Message->clear();
323       llvm::raw_string_ostream Out(*Message);
324       Out << "not available on " << PrettyPlatformName
325           << HintMessage;
326     }
327 
328     return AR_Unavailable;
329   }
330 
331   // Make sure that this declaration has already been introduced.
332   if (!A->getIntroduced().empty() &&
333       TargetMinVersion < A->getIntroduced()) {
334     if (Message) {
335       Message->clear();
336       llvm::raw_string_ostream Out(*Message);
337       Out << "introduced in " << PrettyPlatformName << ' '
338           << A->getIntroduced() << HintMessage;
339     }
340 
341     return AR_NotYetIntroduced;
342   }
343 
344   // Make sure that this declaration hasn't been obsoleted.
345   if (!A->getObsoleted().empty() && TargetMinVersion >= A->getObsoleted()) {
346     if (Message) {
347       Message->clear();
348       llvm::raw_string_ostream Out(*Message);
349       Out << "obsoleted in " << PrettyPlatformName << ' '
350           << A->getObsoleted() << HintMessage;
351     }
352 
353     return AR_Unavailable;
354   }
355 
356   // Make sure that this declaration hasn't been deprecated.
357   if (!A->getDeprecated().empty() && TargetMinVersion >= A->getDeprecated()) {
358     if (Message) {
359       Message->clear();
360       llvm::raw_string_ostream Out(*Message);
361       Out << "first deprecated in " << PrettyPlatformName << ' '
362           << A->getDeprecated() << HintMessage;
363     }
364 
365     return AR_Deprecated;
366   }
367 
368   return AR_Available;
369 }
370 
371 AvailabilityResult Decl::getAvailability(std::string *Message) const {
372   AvailabilityResult Result = AR_Available;
373   std::string ResultMessage;
374 
375   for (attr_iterator A = attr_begin(), AEnd = attr_end(); A != AEnd; ++A) {
376     if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {
377       if (Result >= AR_Deprecated)
378         continue;
379 
380       if (Message)
381         ResultMessage = Deprecated->getMessage();
382 
383       Result = AR_Deprecated;
384       continue;
385     }
386 
387     if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {
388       if (Message)
389         *Message = Unavailable->getMessage();
390       return AR_Unavailable;
391     }
392 
393     if (AvailabilityAttr *Availability = dyn_cast<AvailabilityAttr>(*A)) {
394       AvailabilityResult AR = CheckAvailability(getASTContext(), Availability,
395                                                 Message);
396 
397       if (AR == AR_Unavailable)
398         return AR_Unavailable;
399 
400       if (AR > Result) {
401         Result = AR;
402         if (Message)
403           ResultMessage.swap(*Message);
404       }
405       continue;
406     }
407   }
408 
409   if (Message)
410     Message->swap(ResultMessage);
411   return Result;
412 }
413 
414 bool Decl::canBeWeakImported(bool &IsDefinition) const {
415   IsDefinition = false;
416   if (const VarDecl *Var = dyn_cast<VarDecl>(this)) {
417     if (!Var->hasExternalStorage() || Var->getInit()) {
418       IsDefinition = true;
419       return false;
420     }
421   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) {
422     if (FD->hasBody()) {
423       IsDefinition = true;
424       return false;
425     }
426   } else if (isa<ObjCPropertyDecl>(this) || isa<ObjCMethodDecl>(this))
427     return false;
428   else if (!(getASTContext().getLangOptions().ObjCNonFragileABI &&
429              isa<ObjCInterfaceDecl>(this)))
430     return false;
431 
432   return true;
433 }
434 
435 bool Decl::isWeakImported() const {
436   bool IsDefinition;
437   if (!canBeWeakImported(IsDefinition))
438     return false;
439 
440   for (attr_iterator A = attr_begin(), AEnd = attr_end(); A != AEnd; ++A) {
441     if (isa<WeakImportAttr>(*A))
442       return true;
443 
444     if (AvailabilityAttr *Availability = dyn_cast<AvailabilityAttr>(*A)) {
445       if (CheckAvailability(getASTContext(), Availability, 0)
446                                                          == AR_NotYetIntroduced)
447         return true;
448     }
449   }
450 
451   return false;
452 }
453 
454 unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
455   switch (DeclKind) {
456     case Function:
457     case CXXMethod:
458     case CXXConstructor:
459     case CXXDestructor:
460     case CXXConversion:
461     case EnumConstant:
462     case Var:
463     case ImplicitParam:
464     case ParmVar:
465     case NonTypeTemplateParm:
466     case ObjCMethod:
467     case ObjCProperty:
468       return IDNS_Ordinary;
469     case Label:
470       return IDNS_Label;
471     case IndirectField:
472       return IDNS_Ordinary | IDNS_Member;
473 
474     case ObjCCompatibleAlias:
475     case ObjCInterface:
476       return IDNS_Ordinary | IDNS_Type;
477 
478     case Typedef:
479     case TypeAlias:
480     case TypeAliasTemplate:
481     case UnresolvedUsingTypename:
482     case TemplateTypeParm:
483       return IDNS_Ordinary | IDNS_Type;
484 
485     case UsingShadow:
486       return 0; // we'll actually overwrite this later
487 
488     case UnresolvedUsingValue:
489       return IDNS_Ordinary | IDNS_Using;
490 
491     case Using:
492       return IDNS_Using;
493 
494     case ObjCProtocol:
495       return IDNS_ObjCProtocol;
496 
497     case Field:
498     case ObjCAtDefsField:
499     case ObjCIvar:
500       return IDNS_Member;
501 
502     case Record:
503     case CXXRecord:
504     case Enum:
505       return IDNS_Tag | IDNS_Type;
506 
507     case Namespace:
508     case NamespaceAlias:
509       return IDNS_Namespace;
510 
511     case FunctionTemplate:
512       return IDNS_Ordinary;
513 
514     case ClassTemplate:
515     case TemplateTemplateParm:
516       return IDNS_Ordinary | IDNS_Tag | IDNS_Type;
517 
518     // Never have names.
519     case Friend:
520     case FriendTemplate:
521     case AccessSpec:
522     case LinkageSpec:
523     case FileScopeAsm:
524     case StaticAssert:
525     case ObjCPropertyImpl:
526     case Block:
527     case TranslationUnit:
528 
529     case UsingDirective:
530     case ClassTemplateSpecialization:
531     case ClassTemplatePartialSpecialization:
532     case ClassScopeFunctionSpecialization:
533     case ObjCImplementation:
534     case ObjCCategory:
535     case ObjCCategoryImpl:
536     case Import:
537       // Never looked up by name.
538       return 0;
539   }
540 
541   llvm_unreachable("Invalid DeclKind!");
542 }
543 
544 void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
545   assert(!HasAttrs && "Decl already contains attrs.");
546 
547   AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
548   assert(AttrBlank.empty() && "HasAttrs was wrong?");
549 
550   AttrBlank = attrs;
551   HasAttrs = true;
552 }
553 
554 void Decl::dropAttrs() {
555   if (!HasAttrs) return;
556 
557   HasAttrs = false;
558   getASTContext().eraseDeclAttrs(this);
559 }
560 
561 const AttrVec &Decl::getAttrs() const {
562   assert(HasAttrs && "No attrs to get!");
563   return getASTContext().getDeclAttrs(this);
564 }
565 
566 void Decl::swapAttrs(Decl *RHS) {
567   bool HasLHSAttr = this->HasAttrs;
568   bool HasRHSAttr = RHS->HasAttrs;
569 
570   // Usually, neither decl has attrs, nothing to do.
571   if (!HasLHSAttr && !HasRHSAttr) return;
572 
573   // If 'this' has no attrs, swap the other way.
574   if (!HasLHSAttr)
575     return RHS->swapAttrs(this);
576 
577   ASTContext &Context = getASTContext();
578 
579   // Handle the case when both decls have attrs.
580   if (HasRHSAttr) {
581     std::swap(Context.getDeclAttrs(this), Context.getDeclAttrs(RHS));
582     return;
583   }
584 
585   // Otherwise, LHS has an attr and RHS doesn't.
586   Context.getDeclAttrs(RHS) = Context.getDeclAttrs(this);
587   Context.eraseDeclAttrs(this);
588   this->HasAttrs = false;
589   RHS->HasAttrs = true;
590 }
591 
592 Decl *Decl::castFromDeclContext (const DeclContext *D) {
593   Decl::Kind DK = D->getDeclKind();
594   switch(DK) {
595 #define DECL(NAME, BASE)
596 #define DECL_CONTEXT(NAME) \
597     case Decl::NAME:       \
598       return static_cast<NAME##Decl*>(const_cast<DeclContext*>(D));
599 #define DECL_CONTEXT_BASE(NAME)
600 #include "clang/AST/DeclNodes.inc"
601     default:
602 #define DECL(NAME, BASE)
603 #define DECL_CONTEXT_BASE(NAME)                  \
604       if (DK >= first##NAME && DK <= last##NAME) \
605         return static_cast<NAME##Decl*>(const_cast<DeclContext*>(D));
606 #include "clang/AST/DeclNodes.inc"
607       llvm_unreachable("a decl that inherits DeclContext isn't handled");
608   }
609 }
610 
611 DeclContext *Decl::castToDeclContext(const Decl *D) {
612   Decl::Kind DK = D->getKind();
613   switch(DK) {
614 #define DECL(NAME, BASE)
615 #define DECL_CONTEXT(NAME) \
616     case Decl::NAME:       \
617       return static_cast<NAME##Decl*>(const_cast<Decl*>(D));
618 #define DECL_CONTEXT_BASE(NAME)
619 #include "clang/AST/DeclNodes.inc"
620     default:
621 #define DECL(NAME, BASE)
622 #define DECL_CONTEXT_BASE(NAME)                                   \
623       if (DK >= first##NAME && DK <= last##NAME)                  \
624         return static_cast<NAME##Decl*>(const_cast<Decl*>(D));
625 #include "clang/AST/DeclNodes.inc"
626       llvm_unreachable("a decl that inherits DeclContext isn't handled");
627   }
628 }
629 
630 SourceLocation Decl::getBodyRBrace() const {
631   // Special handling of FunctionDecl to avoid de-serializing the body from PCH.
632   // FunctionDecl stores EndRangeLoc for this purpose.
633   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) {
634     const FunctionDecl *Definition;
635     if (FD->hasBody(Definition))
636       return Definition->getSourceRange().getEnd();
637     return SourceLocation();
638   }
639 
640   if (Stmt *Body = getBody())
641     return Body->getSourceRange().getEnd();
642 
643   return SourceLocation();
644 }
645 
646 void Decl::CheckAccessDeclContext() const {
647 #ifndef NDEBUG
648   // Suppress this check if any of the following hold:
649   // 1. this is the translation unit (and thus has no parent)
650   // 2. this is a template parameter (and thus doesn't belong to its context)
651   // 3. this is a non-type template parameter
652   // 4. the context is not a record
653   // 5. it's invalid
654   // 6. it's a C++0x static_assert.
655   if (isa<TranslationUnitDecl>(this) ||
656       isa<TemplateTypeParmDecl>(this) ||
657       isa<NonTypeTemplateParmDecl>(this) ||
658       !isa<CXXRecordDecl>(getDeclContext()) ||
659       isInvalidDecl() ||
660       isa<StaticAssertDecl>(this) ||
661       // FIXME: a ParmVarDecl can have ClassTemplateSpecialization
662       // as DeclContext (?).
663       isa<ParmVarDecl>(this) ||
664       // FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have
665       // AS_none as access specifier.
666       isa<CXXRecordDecl>(this) ||
667       isa<ClassScopeFunctionSpecializationDecl>(this))
668     return;
669 
670   assert(Access != AS_none &&
671          "Access specifier is AS_none inside a record decl");
672 #endif
673 }
674 
675 DeclContext *Decl::getNonClosureContext() {
676   return getDeclContext()->getNonClosureAncestor();
677 }
678 
679 DeclContext *DeclContext::getNonClosureAncestor() {
680   DeclContext *DC = this;
681 
682   // This is basically "while (DC->isClosure()) DC = DC->getParent();"
683   // except that it's significantly more efficient to cast to a known
684   // decl type and call getDeclContext() than to call getParent().
685   while (isa<BlockDecl>(DC))
686     DC = cast<BlockDecl>(DC)->getDeclContext();
687 
688   assert(!DC->isClosure());
689   return DC;
690 }
691 
692 //===----------------------------------------------------------------------===//
693 // DeclContext Implementation
694 //===----------------------------------------------------------------------===//
695 
696 bool DeclContext::classof(const Decl *D) {
697   switch (D->getKind()) {
698 #define DECL(NAME, BASE)
699 #define DECL_CONTEXT(NAME) case Decl::NAME:
700 #define DECL_CONTEXT_BASE(NAME)
701 #include "clang/AST/DeclNodes.inc"
702       return true;
703     default:
704 #define DECL(NAME, BASE)
705 #define DECL_CONTEXT_BASE(NAME)                 \
706       if (D->getKind() >= Decl::first##NAME &&  \
707           D->getKind() <= Decl::last##NAME)     \
708         return true;
709 #include "clang/AST/DeclNodes.inc"
710       return false;
711   }
712 }
713 
714 DeclContext::~DeclContext() { }
715 
716 /// \brief Find the parent context of this context that will be
717 /// used for unqualified name lookup.
718 ///
719 /// Generally, the parent lookup context is the semantic context. However, for
720 /// a friend function the parent lookup context is the lexical context, which
721 /// is the class in which the friend is declared.
722 DeclContext *DeclContext::getLookupParent() {
723   // FIXME: Find a better way to identify friends
724   if (isa<FunctionDecl>(this))
725     if (getParent()->getRedeclContext()->isFileContext() &&
726         getLexicalParent()->getRedeclContext()->isRecord())
727       return getLexicalParent();
728 
729   return getParent();
730 }
731 
732 bool DeclContext::isInlineNamespace() const {
733   return isNamespace() &&
734          cast<NamespaceDecl>(this)->isInline();
735 }
736 
737 bool DeclContext::isDependentContext() const {
738   if (isFileContext())
739     return false;
740 
741   if (isa<ClassTemplatePartialSpecializationDecl>(this))
742     return true;
743 
744   if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(this)) {
745     if (Record->getDescribedClassTemplate())
746       return true;
747 
748     if (Record->isDependentLambda())
749       return true;
750   }
751 
752   if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(this)) {
753     if (Function->getDescribedFunctionTemplate())
754       return true;
755 
756     // Friend function declarations are dependent if their *lexical*
757     // context is dependent.
758     if (cast<Decl>(this)->getFriendObjectKind())
759       return getLexicalParent()->isDependentContext();
760   }
761 
762   return getParent() && getParent()->isDependentContext();
763 }
764 
765 bool DeclContext::isTransparentContext() const {
766   if (DeclKind == Decl::Enum)
767     return !cast<EnumDecl>(this)->isScoped();
768   else if (DeclKind == Decl::LinkageSpec)
769     return true;
770 
771   return false;
772 }
773 
774 bool DeclContext::isExternCContext() const {
775   const DeclContext *DC = this;
776   while (DC->DeclKind != Decl::TranslationUnit) {
777     if (DC->DeclKind == Decl::LinkageSpec)
778       return cast<LinkageSpecDecl>(DC)->getLanguage()
779         == LinkageSpecDecl::lang_c;
780     DC = DC->getParent();
781   }
782   return false;
783 }
784 
785 bool DeclContext::Encloses(const DeclContext *DC) const {
786   if (getPrimaryContext() != this)
787     return getPrimaryContext()->Encloses(DC);
788 
789   for (; DC; DC = DC->getParent())
790     if (DC->getPrimaryContext() == this)
791       return true;
792   return false;
793 }
794 
795 DeclContext *DeclContext::getPrimaryContext() {
796   switch (DeclKind) {
797   case Decl::TranslationUnit:
798   case Decl::LinkageSpec:
799   case Decl::Block:
800     // There is only one DeclContext for these entities.
801     return this;
802 
803   case Decl::Namespace:
804     // The original namespace is our primary context.
805     return static_cast<NamespaceDecl*>(this)->getOriginalNamespace();
806 
807   case Decl::ObjCMethod:
808     return this;
809 
810   case Decl::ObjCInterface:
811     if (ObjCInterfaceDecl *Def = cast<ObjCInterfaceDecl>(this)->getDefinition())
812       return Def;
813 
814     return this;
815 
816   case Decl::ObjCProtocol:
817     if (ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(this)->getDefinition())
818       return Def;
819 
820     return this;
821 
822   case Decl::ObjCCategory:
823     return this;
824 
825   case Decl::ObjCImplementation:
826   case Decl::ObjCCategoryImpl:
827     return this;
828 
829   default:
830     if (DeclKind >= Decl::firstTag && DeclKind <= Decl::lastTag) {
831       // If this is a tag type that has a definition or is currently
832       // being defined, that definition is our primary context.
833       TagDecl *Tag = cast<TagDecl>(this);
834       assert(isa<TagType>(Tag->TypeForDecl) ||
835              isa<InjectedClassNameType>(Tag->TypeForDecl));
836 
837       if (TagDecl *Def = Tag->getDefinition())
838         return Def;
839 
840       if (!isa<InjectedClassNameType>(Tag->TypeForDecl)) {
841         const TagType *TagTy = cast<TagType>(Tag->TypeForDecl);
842         if (TagTy->isBeingDefined())
843           // FIXME: is it necessarily being defined in the decl
844           // that owns the type?
845           return TagTy->getDecl();
846       }
847 
848       return Tag;
849     }
850 
851     assert(DeclKind >= Decl::firstFunction && DeclKind <= Decl::lastFunction &&
852           "Unknown DeclContext kind");
853     return this;
854   }
855 }
856 
857 void
858 DeclContext::collectAllContexts(llvm::SmallVectorImpl<DeclContext *> &Contexts){
859   Contexts.clear();
860 
861   if (DeclKind != Decl::Namespace) {
862     Contexts.push_back(this);
863     return;
864   }
865 
866   NamespaceDecl *Self = static_cast<NamespaceDecl *>(this);
867   for (NamespaceDecl *N = Self->getMostRecentDecl(); N;
868        N = N->getPreviousDecl())
869     Contexts.push_back(N);
870 
871   std::reverse(Contexts.begin(), Contexts.end());
872 }
873 
874 std::pair<Decl *, Decl *>
875 DeclContext::BuildDeclChain(ArrayRef<Decl*> Decls,
876                             bool FieldsAlreadyLoaded) {
877   // Build up a chain of declarations via the Decl::NextInContextAndBits field.
878   Decl *FirstNewDecl = 0;
879   Decl *PrevDecl = 0;
880   for (unsigned I = 0, N = Decls.size(); I != N; ++I) {
881     if (FieldsAlreadyLoaded && isa<FieldDecl>(Decls[I]))
882       continue;
883 
884     Decl *D = Decls[I];
885     if (PrevDecl)
886       PrevDecl->NextInContextAndBits.setPointer(D);
887     else
888       FirstNewDecl = D;
889 
890     PrevDecl = D;
891   }
892 
893   return std::make_pair(FirstNewDecl, PrevDecl);
894 }
895 
896 /// \brief Load the declarations within this lexical storage from an
897 /// external source.
898 void
899 DeclContext::LoadLexicalDeclsFromExternalStorage() const {
900   ExternalASTSource *Source = getParentASTContext().getExternalSource();
901   assert(hasExternalLexicalStorage() && Source && "No external storage?");
902 
903   // Notify that we have a DeclContext that is initializing.
904   ExternalASTSource::Deserializing ADeclContext(Source);
905 
906   // Load the external declarations, if any.
907   SmallVector<Decl*, 64> Decls;
908   ExternalLexicalStorage = false;
909   switch (Source->FindExternalLexicalDecls(this, Decls)) {
910   case ELR_Success:
911     break;
912 
913   case ELR_Failure:
914   case ELR_AlreadyLoaded:
915     return;
916   }
917 
918   if (Decls.empty())
919     return;
920 
921   // We may have already loaded just the fields of this record, in which case
922   // we need to ignore them.
923   bool FieldsAlreadyLoaded = false;
924   if (const RecordDecl *RD = dyn_cast<RecordDecl>(this))
925     FieldsAlreadyLoaded = RD->LoadedFieldsFromExternalStorage;
926 
927   // Splice the newly-read declarations into the beginning of the list
928   // of declarations.
929   Decl *ExternalFirst, *ExternalLast;
930   llvm::tie(ExternalFirst, ExternalLast) = BuildDeclChain(Decls,
931                                                           FieldsAlreadyLoaded);
932   ExternalLast->NextInContextAndBits.setPointer(FirstDecl);
933   FirstDecl = ExternalFirst;
934   if (!LastDecl)
935     LastDecl = ExternalLast;
936 }
937 
938 DeclContext::lookup_result
939 ExternalASTSource::SetNoExternalVisibleDeclsForName(const DeclContext *DC,
940                                                     DeclarationName Name) {
941   ASTContext &Context = DC->getParentASTContext();
942   StoredDeclsMap *Map;
943   if (!(Map = DC->LookupPtr))
944     Map = DC->CreateStoredDeclsMap(Context);
945 
946   StoredDeclsList &List = (*Map)[Name];
947   assert(List.isNull());
948   (void) List;
949 
950   return DeclContext::lookup_result();
951 }
952 
953 DeclContext::lookup_result
954 ExternalASTSource::SetExternalVisibleDeclsForName(const DeclContext *DC,
955                                                   DeclarationName Name,
956                                                   ArrayRef<NamedDecl*> Decls) {
957   ASTContext &Context = DC->getParentASTContext();;
958 
959   StoredDeclsMap *Map;
960   if (!(Map = DC->LookupPtr))
961     Map = DC->CreateStoredDeclsMap(Context);
962 
963   StoredDeclsList &List = (*Map)[Name];
964   for (ArrayRef<NamedDecl*>::iterator
965          I = Decls.begin(), E = Decls.end(); I != E; ++I) {
966     if (List.isNull())
967       List.setOnlyValue(*I);
968     else
969       List.AddSubsequentDecl(*I);
970   }
971 
972   return List.getLookupResult();
973 }
974 
975 DeclContext::decl_iterator DeclContext::noload_decls_begin() const {
976   return decl_iterator(FirstDecl);
977 }
978 
979 DeclContext::decl_iterator DeclContext::noload_decls_end() const {
980   return decl_iterator();
981 }
982 
983 DeclContext::decl_iterator DeclContext::decls_begin() const {
984   if (hasExternalLexicalStorage())
985     LoadLexicalDeclsFromExternalStorage();
986 
987   return decl_iterator(FirstDecl);
988 }
989 
990 DeclContext::decl_iterator DeclContext::decls_end() const {
991   if (hasExternalLexicalStorage())
992     LoadLexicalDeclsFromExternalStorage();
993 
994   return decl_iterator();
995 }
996 
997 bool DeclContext::decls_empty() const {
998   if (hasExternalLexicalStorage())
999     LoadLexicalDeclsFromExternalStorage();
1000 
1001   return !FirstDecl;
1002 }
1003 
1004 void DeclContext::removeDecl(Decl *D) {
1005   assert(D->getLexicalDeclContext() == this &&
1006          "decl being removed from non-lexical context");
1007   assert((D->NextInContextAndBits.getPointer() || D == LastDecl) &&
1008          "decl is not in decls list");
1009 
1010   // Remove D from the decl chain.  This is O(n) but hopefully rare.
1011   if (D == FirstDecl) {
1012     if (D == LastDecl)
1013       FirstDecl = LastDecl = 0;
1014     else
1015       FirstDecl = D->NextInContextAndBits.getPointer();
1016   } else {
1017     for (Decl *I = FirstDecl; true; I = I->NextInContextAndBits.getPointer()) {
1018       assert(I && "decl not found in linked list");
1019       if (I->NextInContextAndBits.getPointer() == D) {
1020         I->NextInContextAndBits.setPointer(D->NextInContextAndBits.getPointer());
1021         if (D == LastDecl) LastDecl = I;
1022         break;
1023       }
1024     }
1025   }
1026 
1027   // Mark that D is no longer in the decl chain.
1028   D->NextInContextAndBits.setPointer(0);
1029 
1030   // Remove D from the lookup table if necessary.
1031   if (isa<NamedDecl>(D)) {
1032     NamedDecl *ND = cast<NamedDecl>(D);
1033 
1034     // Remove only decls that have a name
1035     if (!ND->getDeclName()) return;
1036 
1037     StoredDeclsMap *Map = getPrimaryContext()->LookupPtr;
1038     if (!Map) return;
1039 
1040     StoredDeclsMap::iterator Pos = Map->find(ND->getDeclName());
1041     assert(Pos != Map->end() && "no lookup entry for decl");
1042     if (Pos->second.getAsVector() || Pos->second.getAsDecl() == ND)
1043       Pos->second.remove(ND);
1044   }
1045 }
1046 
1047 void DeclContext::addHiddenDecl(Decl *D) {
1048   assert(D->getLexicalDeclContext() == this &&
1049          "Decl inserted into wrong lexical context");
1050   assert(!D->getNextDeclInContext() && D != LastDecl &&
1051          "Decl already inserted into a DeclContext");
1052 
1053   if (FirstDecl) {
1054     LastDecl->NextInContextAndBits.setPointer(D);
1055     LastDecl = D;
1056   } else {
1057     FirstDecl = LastDecl = D;
1058   }
1059 
1060   // Notify a C++ record declaration that we've added a member, so it can
1061   // update it's class-specific state.
1062   if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(this))
1063     Record->addedMember(D);
1064 
1065   // If this is a newly-created (not de-serialized) import declaration, wire
1066   // it in to the list of local import declarations.
1067   if (!D->isFromASTFile()) {
1068     if (ImportDecl *Import = dyn_cast<ImportDecl>(D))
1069       D->getASTContext().addedLocalImportDecl(Import);
1070   }
1071 }
1072 
1073 void DeclContext::addDecl(Decl *D) {
1074   addHiddenDecl(D);
1075 
1076   if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
1077     ND->getDeclContext()->makeDeclVisibleInContext(ND);
1078 }
1079 
1080 void DeclContext::addDeclInternal(Decl *D) {
1081   addHiddenDecl(D);
1082 
1083   if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
1084     ND->getDeclContext()->makeDeclVisibleInContextInternal(ND);
1085 }
1086 
1087 /// buildLookup - Build the lookup data structure with all of the
1088 /// declarations in DCtx (and any other contexts linked to it or
1089 /// transparent contexts nested within it).
1090 void DeclContext::buildLookup(DeclContext *DCtx) {
1091   llvm::SmallVector<DeclContext *, 2> Contexts;
1092   DCtx->collectAllContexts(Contexts);
1093   for (unsigned I = 0, N = Contexts.size(); I != N; ++I) {
1094     for (decl_iterator D = Contexts[I]->decls_begin(),
1095                     DEnd = Contexts[I]->decls_end();
1096          D != DEnd; ++D) {
1097       // Insert this declaration into the lookup structure, but only
1098       // if it's semantically in its decl context.  During non-lazy
1099       // lookup building, this is implicitly enforced by addDecl.
1100       if (NamedDecl *ND = dyn_cast<NamedDecl>(*D))
1101         if (D->getDeclContext() == Contexts[I])
1102           makeDeclVisibleInContextImpl(ND, false);
1103 
1104       // If this declaration is itself a transparent declaration context or
1105       // inline namespace, add its members (recursively).
1106       if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D))
1107         if (InnerCtx->isTransparentContext() || InnerCtx->isInlineNamespace())
1108           buildLookup(InnerCtx->getPrimaryContext());
1109     }
1110   }
1111 }
1112 
1113 DeclContext::lookup_result
1114 DeclContext::lookup(DeclarationName Name) {
1115   DeclContext *PrimaryContext = getPrimaryContext();
1116   if (PrimaryContext != this)
1117     return PrimaryContext->lookup(Name);
1118 
1119   if (hasExternalVisibleStorage()) {
1120     // Check to see if we've already cached the lookup results.
1121     if (LookupPtr) {
1122       StoredDeclsMap::iterator I = LookupPtr->find(Name);
1123       if (I != LookupPtr->end())
1124         return I->second.getLookupResult();
1125     }
1126 
1127     ExternalASTSource *Source = getParentASTContext().getExternalSource();
1128     return Source->FindExternalVisibleDeclsByName(this, Name);
1129   }
1130 
1131   /// If there is no lookup data structure, build one now by walking
1132   /// all of the linked DeclContexts (in declaration order!) and
1133   /// inserting their values.
1134   if (!LookupPtr) {
1135     buildLookup(this);
1136 
1137     if (!LookupPtr)
1138       return lookup_result(lookup_iterator(0), lookup_iterator(0));
1139   }
1140 
1141   StoredDeclsMap::iterator Pos = LookupPtr->find(Name);
1142   if (Pos == LookupPtr->end())
1143     return lookup_result(lookup_iterator(0), lookup_iterator(0));
1144   return Pos->second.getLookupResult();
1145 }
1146 
1147 DeclContext::lookup_const_result
1148 DeclContext::lookup(DeclarationName Name) const {
1149   return const_cast<DeclContext*>(this)->lookup(Name);
1150 }
1151 
1152 void DeclContext::localUncachedLookup(DeclarationName Name,
1153                                   llvm::SmallVectorImpl<NamedDecl *> &Results) {
1154   Results.clear();
1155 
1156   // If there's no external storage, just perform a normal lookup and copy
1157   // the results.
1158   if (!hasExternalVisibleStorage() && !hasExternalLexicalStorage()) {
1159     lookup_result LookupResults = lookup(Name);
1160     Results.insert(Results.end(), LookupResults.first, LookupResults.second);
1161     return;
1162   }
1163 
1164   // If we have a lookup table, check there first. Maybe we'll get lucky.
1165   if (LookupPtr) {
1166     StoredDeclsMap::iterator Pos = LookupPtr->find(Name);
1167     if (Pos != LookupPtr->end()) {
1168       Results.insert(Results.end(),
1169                      Pos->second.getLookupResult().first,
1170                      Pos->second.getLookupResult().second);
1171       return;
1172     }
1173   }
1174 
1175   // Slow case: grovel through the declarations in our chain looking for
1176   // matches.
1177   for (Decl *D = FirstDecl; D; D = D->getNextDeclInContext()) {
1178     if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
1179       if (ND->getDeclName() == Name)
1180         Results.push_back(ND);
1181   }
1182 }
1183 
1184 DeclContext *DeclContext::getRedeclContext() {
1185   DeclContext *Ctx = this;
1186   // Skip through transparent contexts.
1187   while (Ctx->isTransparentContext())
1188     Ctx = Ctx->getParent();
1189   return Ctx;
1190 }
1191 
1192 DeclContext *DeclContext::getEnclosingNamespaceContext() {
1193   DeclContext *Ctx = this;
1194   // Skip through non-namespace, non-translation-unit contexts.
1195   while (!Ctx->isFileContext())
1196     Ctx = Ctx->getParent();
1197   return Ctx->getPrimaryContext();
1198 }
1199 
1200 bool DeclContext::InEnclosingNamespaceSetOf(const DeclContext *O) const {
1201   // For non-file contexts, this is equivalent to Equals.
1202   if (!isFileContext())
1203     return O->Equals(this);
1204 
1205   do {
1206     if (O->Equals(this))
1207       return true;
1208 
1209     const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(O);
1210     if (!NS || !NS->isInline())
1211       break;
1212     O = NS->getParent();
1213   } while (O);
1214 
1215   return false;
1216 }
1217 
1218 void DeclContext::makeDeclVisibleInContext(NamedDecl *D, bool Recoverable)
1219 {
1220     makeDeclVisibleInContextWithFlags(D, false, Recoverable);
1221 }
1222 
1223 void DeclContext::makeDeclVisibleInContextInternal(NamedDecl *D, bool Recoverable)
1224 {
1225     makeDeclVisibleInContextWithFlags(D, true, Recoverable);
1226 }
1227 
1228 void DeclContext::makeDeclVisibleInContextWithFlags(NamedDecl *D, bool Internal, bool Recoverable) {
1229   // FIXME: This feels like a hack. Should DeclarationName support
1230   // template-ids, or is there a better way to keep specializations
1231   // from being visible?
1232   if (isa<ClassTemplateSpecializationDecl>(D) || D->isTemplateParameter())
1233     return;
1234   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
1235     if (FD->isFunctionTemplateSpecialization())
1236       return;
1237 
1238   DeclContext *PrimaryContext = getPrimaryContext();
1239   if (PrimaryContext != this) {
1240     PrimaryContext->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
1241     return;
1242   }
1243 
1244   // If we already have a lookup data structure, perform the insertion
1245   // into it. If we haven't deserialized externally stored decls, deserialize
1246   // them so we can add the decl. Otherwise, be lazy and don't build that
1247   // structure until someone asks for it.
1248   if (LookupPtr || !Recoverable || hasExternalVisibleStorage())
1249     makeDeclVisibleInContextImpl(D, Internal);
1250 
1251   // If we are a transparent context or inline namespace, insert into our
1252   // parent context, too. This operation is recursive.
1253   if (isTransparentContext() || isInlineNamespace())
1254     getParent()->makeDeclVisibleInContextWithFlags(D, Internal, Recoverable);
1255 
1256   Decl *DCAsDecl = cast<Decl>(this);
1257   // Notify that a decl was made visible unless it's a Tag being defined.
1258   if (!(isa<TagDecl>(DCAsDecl) && cast<TagDecl>(DCAsDecl)->isBeingDefined()))
1259     if (ASTMutationListener *L = DCAsDecl->getASTMutationListener())
1260       L->AddedVisibleDecl(this, D);
1261 }
1262 
1263 void DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D, bool Internal) {
1264   // Skip unnamed declarations.
1265   if (!D->getDeclName())
1266     return;
1267 
1268   // Skip entities that can't be found by name lookup into a particular
1269   // context.
1270   if ((D->getIdentifierNamespace() == 0 && !isa<UsingDirectiveDecl>(D)) ||
1271       D->isTemplateParameter())
1272     return;
1273 
1274   ASTContext *C = 0;
1275   if (!LookupPtr) {
1276     C = &getParentASTContext();
1277     CreateStoredDeclsMap(*C);
1278   }
1279 
1280   // If there is an external AST source, load any declarations it knows about
1281   // with this declaration's name.
1282   // If the lookup table contains an entry about this name it means that we
1283   // have already checked the external source.
1284   if (!Internal)
1285     if (ExternalASTSource *Source = getParentASTContext().getExternalSource())
1286       if (hasExternalVisibleStorage() &&
1287           LookupPtr->find(D->getDeclName()) == LookupPtr->end())
1288         Source->FindExternalVisibleDeclsByName(this, D->getDeclName());
1289 
1290   // Insert this declaration into the map.
1291   StoredDeclsList &DeclNameEntries = (*LookupPtr)[D->getDeclName()];
1292   if (DeclNameEntries.isNull()) {
1293     DeclNameEntries.setOnlyValue(D);
1294     return;
1295   }
1296 
1297   // If it is possible that this is a redeclaration, check to see if there is
1298   // already a decl for which declarationReplaces returns true.  If there is
1299   // one, just replace it and return.
1300   if (DeclNameEntries.HandleRedeclaration(D))
1301     return;
1302 
1303   // Put this declaration into the appropriate slot.
1304   DeclNameEntries.AddSubsequentDecl(D);
1305 }
1306 
1307 /// Returns iterator range [First, Last) of UsingDirectiveDecls stored within
1308 /// this context.
1309 DeclContext::udir_iterator_range
1310 DeclContext::getUsingDirectives() const {
1311   lookup_const_result Result = lookup(UsingDirectiveDecl::getName());
1312   return udir_iterator_range(reinterpret_cast<udir_iterator>(Result.first),
1313                              reinterpret_cast<udir_iterator>(Result.second));
1314 }
1315 
1316 //===----------------------------------------------------------------------===//
1317 // Creation and Destruction of StoredDeclsMaps.                               //
1318 //===----------------------------------------------------------------------===//
1319 
1320 StoredDeclsMap *DeclContext::CreateStoredDeclsMap(ASTContext &C) const {
1321   assert(!LookupPtr && "context already has a decls map");
1322   assert(getPrimaryContext() == this &&
1323          "creating decls map on non-primary context");
1324 
1325   StoredDeclsMap *M;
1326   bool Dependent = isDependentContext();
1327   if (Dependent)
1328     M = new DependentStoredDeclsMap();
1329   else
1330     M = new StoredDeclsMap();
1331   M->Previous = C.LastSDM;
1332   C.LastSDM = llvm::PointerIntPair<StoredDeclsMap*,1>(M, Dependent);
1333   LookupPtr = M;
1334   return M;
1335 }
1336 
1337 void ASTContext::ReleaseDeclContextMaps() {
1338   // It's okay to delete DependentStoredDeclsMaps via a StoredDeclsMap
1339   // pointer because the subclass doesn't add anything that needs to
1340   // be deleted.
1341   StoredDeclsMap::DestroyAll(LastSDM.getPointer(), LastSDM.getInt());
1342 }
1343 
1344 void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) {
1345   while (Map) {
1346     // Advance the iteration before we invalidate memory.
1347     llvm::PointerIntPair<StoredDeclsMap*,1> Next = Map->Previous;
1348 
1349     if (Dependent)
1350       delete static_cast<DependentStoredDeclsMap*>(Map);
1351     else
1352       delete Map;
1353 
1354     Map = Next.getPointer();
1355     Dependent = Next.getInt();
1356   }
1357 }
1358 
1359 DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C,
1360                                                  DeclContext *Parent,
1361                                            const PartialDiagnostic &PDiag) {
1362   assert(Parent->isDependentContext()
1363          && "cannot iterate dependent diagnostics of non-dependent context");
1364   Parent = Parent->getPrimaryContext();
1365   if (!Parent->LookupPtr)
1366     Parent->CreateStoredDeclsMap(C);
1367 
1368   DependentStoredDeclsMap *Map
1369     = static_cast<DependentStoredDeclsMap*>(Parent->LookupPtr);
1370 
1371   // Allocate the copy of the PartialDiagnostic via the ASTContext's
1372   // BumpPtrAllocator, rather than the ASTContext itself.
1373   PartialDiagnostic::Storage *DiagStorage = 0;
1374   if (PDiag.hasStorage())
1375     DiagStorage = new (C) PartialDiagnostic::Storage;
1376 
1377   DependentDiagnostic *DD = new (C) DependentDiagnostic(PDiag, DiagStorage);
1378 
1379   // TODO: Maybe we shouldn't reverse the order during insertion.
1380   DD->NextDiagnostic = Map->FirstDiagnostic;
1381   Map->FirstDiagnostic = DD;
1382 
1383   return DD;
1384 }
1385