]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/AST/Decl.cpp
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / AST / Decl.cpp
1 //===--- Decl.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 subclasses.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/AST/Decl.h"
15 #include "clang/AST/DeclCXX.h"
16 #include "clang/AST/DeclObjC.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/TypeLoc.h"
20 #include "clang/AST/Stmt.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/PrettyPrinter.h"
24 #include "clang/AST/ASTMutationListener.h"
25 #include "clang/Basic/Builtins.h"
26 #include "clang/Basic/IdentifierTable.h"
27 #include "clang/Basic/Specifiers.h"
28 #include "clang/Basic/TargetInfo.h"
29 #include "llvm/Support/ErrorHandling.h"
30
31 #include <algorithm>
32
33 using namespace clang;
34
35 //===----------------------------------------------------------------------===//
36 // NamedDecl Implementation
37 //===----------------------------------------------------------------------===//
38
39 static llvm::Optional<Visibility> getVisibilityOf(const Decl *D) {
40   // If this declaration has an explicit visibility attribute, use it.
41   if (const VisibilityAttr *A = D->getAttr<VisibilityAttr>()) {
42     switch (A->getVisibility()) {
43     case VisibilityAttr::Default:
44       return DefaultVisibility;
45     case VisibilityAttr::Hidden:
46       return HiddenVisibility;
47     case VisibilityAttr::Protected:
48       return ProtectedVisibility;
49     }
50
51     return DefaultVisibility;
52   }
53
54   // If we're on Mac OS X, an 'availability' for Mac OS X attribute
55   // implies visibility(default).
56   if (D->getASTContext().getTargetInfo().getTriple().isOSDarwin()) {
57     for (specific_attr_iterator<AvailabilityAttr> 
58               A = D->specific_attr_begin<AvailabilityAttr>(),
59            AEnd = D->specific_attr_end<AvailabilityAttr>();
60          A != AEnd; ++A)
61       if ((*A)->getPlatform()->getName().equals("macosx"))
62         return DefaultVisibility;
63   }
64
65   return llvm::Optional<Visibility>();
66 }
67
68 typedef NamedDecl::LinkageInfo LinkageInfo;
69 typedef std::pair<Linkage,Visibility> LVPair;
70
71 static LVPair merge(LVPair L, LVPair R) {
72   return LVPair(minLinkage(L.first, R.first),
73                 minVisibility(L.second, R.second));
74 }
75
76 static LVPair merge(LVPair L, LinkageInfo R) {
77   return LVPair(minLinkage(L.first, R.linkage()),
78                 minVisibility(L.second, R.visibility()));
79 }
80
81 namespace {
82 /// Flags controlling the computation of linkage and visibility.
83 struct LVFlags {
84   bool ConsiderGlobalVisibility;
85   bool ConsiderVisibilityAttributes;
86   bool ConsiderTemplateParameterTypes;
87
88   LVFlags() : ConsiderGlobalVisibility(true), 
89               ConsiderVisibilityAttributes(true),
90               ConsiderTemplateParameterTypes(true) {
91   }
92
93   /// \brief Returns a set of flags that is only useful for computing the 
94   /// linkage, not the visibility, of a declaration.
95   static LVFlags CreateOnlyDeclLinkage() {
96     LVFlags F;
97     F.ConsiderGlobalVisibility = false;
98     F.ConsiderVisibilityAttributes = false;
99     F.ConsiderTemplateParameterTypes = false;
100     return F;
101   }
102   
103   /// Returns a set of flags, otherwise based on these, which ignores
104   /// off all sources of visibility except template arguments.
105   LVFlags onlyTemplateVisibility() const {
106     LVFlags F = *this;
107     F.ConsiderGlobalVisibility = false;
108     F.ConsiderVisibilityAttributes = false;
109     F.ConsiderTemplateParameterTypes = false;
110     return F;
111   }
112 }; 
113 } // end anonymous namespace
114
115 /// \brief Get the most restrictive linkage for the types in the given
116 /// template parameter list.
117 static LVPair 
118 getLVForTemplateParameterList(const TemplateParameterList *Params) {
119   LVPair LV(ExternalLinkage, DefaultVisibility);
120   for (TemplateParameterList::const_iterator P = Params->begin(),
121                                           PEnd = Params->end();
122        P != PEnd; ++P) {
123     if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
124       if (NTTP->isExpandedParameterPack()) {
125         for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {
126           QualType T = NTTP->getExpansionType(I);
127           if (!T->isDependentType())
128             LV = merge(LV, T->getLinkageAndVisibility());
129         }
130         continue;
131       }
132       
133       if (!NTTP->getType()->isDependentType()) {
134         LV = merge(LV, NTTP->getType()->getLinkageAndVisibility());
135         continue;
136       }
137     }
138
139     if (TemplateTemplateParmDecl *TTP
140                                    = dyn_cast<TemplateTemplateParmDecl>(*P)) {
141       LV = merge(LV, getLVForTemplateParameterList(TTP->getTemplateParameters()));
142     }
143   }
144
145   return LV;
146 }
147
148 /// getLVForDecl - Get the linkage and visibility for the given declaration.
149 static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags F);
150
151 /// \brief Get the most restrictive linkage for the types and
152 /// declarations in the given template argument list.
153 static LVPair getLVForTemplateArgumentList(const TemplateArgument *Args,
154                                            unsigned NumArgs,
155                                            LVFlags &F) {
156   LVPair LV(ExternalLinkage, DefaultVisibility);
157
158   for (unsigned I = 0; I != NumArgs; ++I) {
159     switch (Args[I].getKind()) {
160     case TemplateArgument::Null:
161     case TemplateArgument::Integral:
162     case TemplateArgument::Expression:
163       break;
164       
165     case TemplateArgument::Type:
166       LV = merge(LV, Args[I].getAsType()->getLinkageAndVisibility());
167       break;
168
169     case TemplateArgument::Declaration:
170       // The decl can validly be null as the representation of nullptr
171       // arguments, valid only in C++0x.
172       if (Decl *D = Args[I].getAsDecl()) {
173         if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
174           LV = merge(LV, getLVForDecl(ND, F));
175       }
176       break;
177
178     case TemplateArgument::Template:
179     case TemplateArgument::TemplateExpansion:
180       if (TemplateDecl *Template 
181                 = Args[I].getAsTemplateOrTemplatePattern().getAsTemplateDecl())
182         LV = merge(LV, getLVForDecl(Template, F));
183       break;
184
185     case TemplateArgument::Pack:
186       LV = merge(LV, getLVForTemplateArgumentList(Args[I].pack_begin(),
187                                                   Args[I].pack_size(),
188                                                   F));
189       break;
190     }
191   }
192
193   return LV;
194 }
195
196 static LVPair
197 getLVForTemplateArgumentList(const TemplateArgumentList &TArgs,
198                              LVFlags &F) {
199   return getLVForTemplateArgumentList(TArgs.data(), TArgs.size(), F);
200 }
201
202 static bool shouldConsiderTemplateLV(const FunctionDecl *fn,
203                                const FunctionTemplateSpecializationInfo *spec) {
204   return !(spec->isExplicitSpecialization() &&
205            fn->hasAttr<VisibilityAttr>());
206 }
207
208 static bool shouldConsiderTemplateLV(const ClassTemplateSpecializationDecl *d) {
209   return !(d->isExplicitSpecialization() && d->hasAttr<VisibilityAttr>());
210 }
211
212 static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
213   assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
214          "Not a name having namespace scope");
215   ASTContext &Context = D->getASTContext();
216
217   // C++ [basic.link]p3:
218   //   A name having namespace scope (3.3.6) has internal linkage if it
219   //   is the name of
220   //     - an object, reference, function or function template that is
221   //       explicitly declared static; or,
222   // (This bullet corresponds to C99 6.2.2p3.)
223   if (const VarDecl *Var = dyn_cast<VarDecl>(D)) {
224     // Explicitly declared static.
225     if (Var->getStorageClass() == SC_Static)
226       return LinkageInfo::internal();
227
228     // - an object or reference that is explicitly declared const
229     //   and neither explicitly declared extern nor previously
230     //   declared to have external linkage; or
231     // (there is no equivalent in C99)
232     if (Context.getLangOptions().CPlusPlus &&
233         Var->getType().isConstant(Context) && 
234         Var->getStorageClass() != SC_Extern &&
235         Var->getStorageClass() != SC_PrivateExtern) {
236       bool FoundExtern = false;
237       for (const VarDecl *PrevVar = Var->getPreviousDeclaration();
238            PrevVar && !FoundExtern; 
239            PrevVar = PrevVar->getPreviousDeclaration())
240         if (isExternalLinkage(PrevVar->getLinkage()))
241           FoundExtern = true;
242       
243       if (!FoundExtern)
244         return LinkageInfo::internal();
245     }
246     if (Var->getStorageClass() == SC_None) {
247       const VarDecl *PrevVar = Var->getPreviousDeclaration();
248       for (; PrevVar; PrevVar = PrevVar->getPreviousDeclaration())
249         if (PrevVar->getStorageClass() == SC_PrivateExtern)
250           break;
251         if (PrevVar)
252           return PrevVar->getLinkageAndVisibility();
253     }
254   } else if (isa<FunctionDecl>(D) || isa<FunctionTemplateDecl>(D)) {
255     // C++ [temp]p4:
256     //   A non-member function template can have internal linkage; any
257     //   other template name shall have external linkage.
258     const FunctionDecl *Function = 0;
259     if (const FunctionTemplateDecl *FunTmpl
260                                         = dyn_cast<FunctionTemplateDecl>(D))
261       Function = FunTmpl->getTemplatedDecl();
262     else
263       Function = cast<FunctionDecl>(D);
264
265     // Explicitly declared static.
266     if (Function->getStorageClass() == SC_Static)
267       return LinkageInfo(InternalLinkage, DefaultVisibility, false);
268   } else if (const FieldDecl *Field = dyn_cast<FieldDecl>(D)) {
269     //   - a data member of an anonymous union.
270     if (cast<RecordDecl>(Field->getDeclContext())->isAnonymousStructOrUnion())
271       return LinkageInfo::internal();
272   }
273
274   if (D->isInAnonymousNamespace()) {
275     const VarDecl *Var = dyn_cast<VarDecl>(D);
276     const FunctionDecl *Func = dyn_cast<FunctionDecl>(D);
277     if ((!Var || !Var->isExternC()) && (!Func || !Func->isExternC()))
278       return LinkageInfo::uniqueExternal();
279   }
280
281   // Set up the defaults.
282
283   // C99 6.2.2p5:
284   //   If the declaration of an identifier for an object has file
285   //   scope and no storage-class specifier, its linkage is
286   //   external.
287   LinkageInfo LV;
288
289   if (F.ConsiderVisibilityAttributes) {
290     if (llvm::Optional<Visibility> Vis = D->getExplicitVisibility()) {
291       LV.setVisibility(*Vis, true);
292       F.ConsiderGlobalVisibility = false;
293     } else {
294       // If we're declared in a namespace with a visibility attribute,
295       // use that namespace's visibility, but don't call it explicit.
296       for (const DeclContext *DC = D->getDeclContext();
297            !isa<TranslationUnitDecl>(DC);
298            DC = DC->getParent()) {
299         if (!isa<NamespaceDecl>(DC)) continue;
300         if (llvm::Optional<Visibility> Vis
301                            = cast<NamespaceDecl>(DC)->getExplicitVisibility()) {
302           LV.setVisibility(*Vis, false);
303           F.ConsiderGlobalVisibility = false;
304           break;
305         }
306       }
307     }
308   }
309
310   // C++ [basic.link]p4:
311
312   //   A name having namespace scope has external linkage if it is the
313   //   name of
314   //
315   //     - an object or reference, unless it has internal linkage; or
316   if (const VarDecl *Var = dyn_cast<VarDecl>(D)) {
317     // GCC applies the following optimization to variables and static
318     // data members, but not to functions:
319     //
320     // Modify the variable's LV by the LV of its type unless this is
321     // C or extern "C".  This follows from [basic.link]p9:
322     //   A type without linkage shall not be used as the type of a
323     //   variable or function with external linkage unless
324     //    - the entity has C language linkage, or
325     //    - the entity is declared within an unnamed namespace, or
326     //    - the entity is not used or is defined in the same
327     //      translation unit.
328     // and [basic.link]p10:
329     //   ...the types specified by all declarations referring to a
330     //   given variable or function shall be identical...
331     // C does not have an equivalent rule.
332     //
333     // Ignore this if we've got an explicit attribute;  the user
334     // probably knows what they're doing.
335     //
336     // Note that we don't want to make the variable non-external
337     // because of this, but unique-external linkage suits us.
338     if (Context.getLangOptions().CPlusPlus && !Var->isExternC()) {
339       LVPair TypeLV = Var->getType()->getLinkageAndVisibility();
340       if (TypeLV.first != ExternalLinkage)
341         return LinkageInfo::uniqueExternal();
342       if (!LV.visibilityExplicit())
343         LV.mergeVisibility(TypeLV.second);
344     }
345
346     if (Var->getStorageClass() == SC_PrivateExtern)
347       LV.setVisibility(HiddenVisibility, true);
348
349     if (!Context.getLangOptions().CPlusPlus &&
350         (Var->getStorageClass() == SC_Extern ||
351          Var->getStorageClass() == SC_PrivateExtern)) {
352
353       // C99 6.2.2p4:
354       //   For an identifier declared with the storage-class specifier
355       //   extern in a scope in which a prior declaration of that
356       //   identifier is visible, if the prior declaration specifies
357       //   internal or external linkage, the linkage of the identifier
358       //   at the later declaration is the same as the linkage
359       //   specified at the prior declaration. If no prior declaration
360       //   is visible, or if the prior declaration specifies no
361       //   linkage, then the identifier has external linkage.
362       if (const VarDecl *PrevVar = Var->getPreviousDeclaration()) {
363         LinkageInfo PrevLV = getLVForDecl(PrevVar, F);
364         if (PrevLV.linkage()) LV.setLinkage(PrevLV.linkage());
365         LV.mergeVisibility(PrevLV);
366       }
367     }
368
369   //     - a function, unless it has internal linkage; or
370   } else if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
371     // In theory, we can modify the function's LV by the LV of its
372     // type unless it has C linkage (see comment above about variables
373     // for justification).  In practice, GCC doesn't do this, so it's
374     // just too painful to make work.
375
376     if (Function->getStorageClass() == SC_PrivateExtern)
377       LV.setVisibility(HiddenVisibility, true);
378
379     // C99 6.2.2p5:
380     //   If the declaration of an identifier for a function has no
381     //   storage-class specifier, its linkage is determined exactly
382     //   as if it were declared with the storage-class specifier
383     //   extern.
384     if (!Context.getLangOptions().CPlusPlus &&
385         (Function->getStorageClass() == SC_Extern ||
386          Function->getStorageClass() == SC_PrivateExtern ||
387          Function->getStorageClass() == SC_None)) {
388       // C99 6.2.2p4:
389       //   For an identifier declared with the storage-class specifier
390       //   extern in a scope in which a prior declaration of that
391       //   identifier is visible, if the prior declaration specifies
392       //   internal or external linkage, the linkage of the identifier
393       //   at the later declaration is the same as the linkage
394       //   specified at the prior declaration. If no prior declaration
395       //   is visible, or if the prior declaration specifies no
396       //   linkage, then the identifier has external linkage.
397       if (const FunctionDecl *PrevFunc = Function->getPreviousDeclaration()) {
398         LinkageInfo PrevLV = getLVForDecl(PrevFunc, F);
399         if (PrevLV.linkage()) LV.setLinkage(PrevLV.linkage());
400         LV.mergeVisibility(PrevLV);
401       }
402     }
403
404     // In C++, then if the type of the function uses a type with
405     // unique-external linkage, it's not legally usable from outside
406     // this translation unit.  However, we should use the C linkage
407     // rules instead for extern "C" declarations.
408     if (Context.getLangOptions().CPlusPlus && !Function->isExternC() &&
409         Function->getType()->getLinkage() == UniqueExternalLinkage)
410       return LinkageInfo::uniqueExternal();
411
412     // Consider LV from the template and the template arguments unless
413     // this is an explicit specialization with a visibility attribute.
414     if (FunctionTemplateSpecializationInfo *specInfo
415                                = Function->getTemplateSpecializationInfo()) {
416       if (shouldConsiderTemplateLV(Function, specInfo)) {
417         LV.merge(getLVForDecl(specInfo->getTemplate(),
418                               F.onlyTemplateVisibility()));
419         const TemplateArgumentList &templateArgs = *specInfo->TemplateArguments;
420         LV.merge(getLVForTemplateArgumentList(templateArgs, F));
421       }
422     }
423
424   //     - a named class (Clause 9), or an unnamed class defined in a
425   //       typedef declaration in which the class has the typedef name
426   //       for linkage purposes (7.1.3); or
427   //     - a named enumeration (7.2), or an unnamed enumeration
428   //       defined in a typedef declaration in which the enumeration
429   //       has the typedef name for linkage purposes (7.1.3); or
430   } else if (const TagDecl *Tag = dyn_cast<TagDecl>(D)) {
431     // Unnamed tags have no linkage.
432     if (!Tag->getDeclName() && !Tag->getTypedefNameForAnonDecl())
433       return LinkageInfo::none();
434
435     // If this is a class template specialization, consider the
436     // linkage of the template and template arguments.
437     if (const ClassTemplateSpecializationDecl *spec
438           = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) {
439       if (shouldConsiderTemplateLV(spec)) {
440         // From the template.
441         LV.merge(getLVForDecl(spec->getSpecializedTemplate(),
442                               F.onlyTemplateVisibility()));
443
444         // The arguments at which the template was instantiated.
445         const TemplateArgumentList &TemplateArgs = spec->getTemplateArgs();
446         LV.merge(getLVForTemplateArgumentList(TemplateArgs, F));
447       }
448     }
449
450     // Consider -fvisibility unless the type has C linkage.
451     if (F.ConsiderGlobalVisibility)
452       F.ConsiderGlobalVisibility =
453         (Context.getLangOptions().CPlusPlus &&
454          !Tag->getDeclContext()->isExternCContext());
455
456   //     - an enumerator belonging to an enumeration with external linkage;
457   } else if (isa<EnumConstantDecl>(D)) {
458     LinkageInfo EnumLV = getLVForDecl(cast<NamedDecl>(D->getDeclContext()), F);
459     if (!isExternalLinkage(EnumLV.linkage()))
460       return LinkageInfo::none();
461     LV.merge(EnumLV);
462
463   //     - a template, unless it is a function template that has
464   //       internal linkage (Clause 14);
465   } else if (const TemplateDecl *temp = dyn_cast<TemplateDecl>(D)) {
466     if (F.ConsiderTemplateParameterTypes)
467       LV.merge(getLVForTemplateParameterList(temp->getTemplateParameters()));
468
469   //     - a namespace (7.3), unless it is declared within an unnamed
470   //       namespace.
471   } else if (isa<NamespaceDecl>(D) && !D->isInAnonymousNamespace()) {
472     return LV;
473
474   // By extension, we assign external linkage to Objective-C
475   // interfaces.
476   } else if (isa<ObjCInterfaceDecl>(D)) {
477     // fallout
478
479   // Everything not covered here has no linkage.
480   } else {
481     return LinkageInfo::none();
482   }
483
484   // If we ended up with non-external linkage, visibility should
485   // always be default.
486   if (LV.linkage() != ExternalLinkage)
487     return LinkageInfo(LV.linkage(), DefaultVisibility, false);
488
489   // If we didn't end up with hidden visibility, consider attributes
490   // and -fvisibility.
491   if (F.ConsiderGlobalVisibility)
492     LV.mergeVisibility(Context.getLangOptions().getVisibilityMode());
493
494   return LV;
495 }
496
497 static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) {
498   // Only certain class members have linkage.  Note that fields don't
499   // really have linkage, but it's convenient to say they do for the
500   // purposes of calculating linkage of pointer-to-data-member
501   // template arguments.
502   if (!(isa<CXXMethodDecl>(D) ||
503         isa<VarDecl>(D) ||
504         isa<FieldDecl>(D) ||
505         (isa<TagDecl>(D) &&
506          (D->getDeclName() || cast<TagDecl>(D)->getTypedefNameForAnonDecl()))))
507     return LinkageInfo::none();
508
509   LinkageInfo LV;
510
511   // The flags we're going to use to compute the class's visibility.
512   LVFlags ClassF = F;
513
514   // If we have an explicit visibility attribute, merge that in.
515   if (F.ConsiderVisibilityAttributes) {
516     if (llvm::Optional<Visibility> Vis = D->getExplicitVisibility()) {
517       LV.mergeVisibility(*Vis, true);
518
519       // Ignore global visibility later, but not this attribute.
520       F.ConsiderGlobalVisibility = false;
521
522       // Ignore both global visibility and attributes when computing our
523       // parent's visibility.
524       ClassF = F.onlyTemplateVisibility();
525     }
526   }
527
528   // Class members only have linkage if their class has external
529   // linkage.
530   LV.merge(getLVForDecl(cast<RecordDecl>(D->getDeclContext()), ClassF));
531   if (!isExternalLinkage(LV.linkage()))
532     return LinkageInfo::none();
533
534   // If the class already has unique-external linkage, we can't improve.
535   if (LV.linkage() == UniqueExternalLinkage)
536     return LinkageInfo::uniqueExternal();
537
538   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
539     // If the type of the function uses a type with unique-external
540     // linkage, it's not legally usable from outside this translation unit.
541     if (MD->getType()->getLinkage() == UniqueExternalLinkage)
542       return LinkageInfo::uniqueExternal();
543
544     TemplateSpecializationKind TSK = TSK_Undeclared;
545
546     // If this is a method template specialization, use the linkage for
547     // the template parameters and arguments.
548     if (FunctionTemplateSpecializationInfo *spec
549            = MD->getTemplateSpecializationInfo()) {
550       if (shouldConsiderTemplateLV(MD, spec)) {
551         LV.merge(getLVForTemplateArgumentList(*spec->TemplateArguments, F));
552         if (F.ConsiderTemplateParameterTypes)
553           LV.merge(getLVForTemplateParameterList(
554                               spec->getTemplate()->getTemplateParameters()));
555       }
556
557       TSK = spec->getTemplateSpecializationKind();
558     } else if (MemberSpecializationInfo *MSI =
559                  MD->getMemberSpecializationInfo()) {
560       TSK = MSI->getTemplateSpecializationKind();
561     }
562
563     // If we're paying attention to global visibility, apply
564     // -finline-visibility-hidden if this is an inline method.
565     //
566     // Note that ConsiderGlobalVisibility doesn't yet have information
567     // about whether containing classes have visibility attributes,
568     // and that's intentional.
569     if (TSK != TSK_ExplicitInstantiationDeclaration &&
570         F.ConsiderGlobalVisibility &&
571         MD->getASTContext().getLangOptions().InlineVisibilityHidden) {
572       // InlineVisibilityHidden only applies to definitions, and
573       // isInlined() only gives meaningful answers on definitions
574       // anyway.
575       const FunctionDecl *Def = 0;
576       if (MD->hasBody(Def) && Def->isInlined())
577         LV.setVisibility(HiddenVisibility);
578     }
579
580     // Note that in contrast to basically every other situation, we
581     // *do* apply -fvisibility to method declarations.
582
583   } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
584     if (const ClassTemplateSpecializationDecl *spec
585         = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
586       if (shouldConsiderTemplateLV(spec)) {
587         // Merge template argument/parameter information for member
588         // class template specializations.
589         LV.merge(getLVForTemplateArgumentList(spec->getTemplateArgs(), F));
590       if (F.ConsiderTemplateParameterTypes)
591         LV.merge(getLVForTemplateParameterList(
592                     spec->getSpecializedTemplate()->getTemplateParameters()));
593       }
594     }
595
596   // Static data members.
597   } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
598     // Modify the variable's linkage by its type, but ignore the
599     // type's visibility unless it's a definition.
600     LVPair TypeLV = VD->getType()->getLinkageAndVisibility();
601     if (TypeLV.first != ExternalLinkage)
602       LV.mergeLinkage(UniqueExternalLinkage);
603     if (!LV.visibilityExplicit())
604       LV.mergeVisibility(TypeLV.second);
605   }
606
607   F.ConsiderGlobalVisibility &= !LV.visibilityExplicit();
608
609   // Apply -fvisibility if desired.
610   if (F.ConsiderGlobalVisibility && LV.visibility() != HiddenVisibility) {
611     LV.mergeVisibility(D->getASTContext().getLangOptions().getVisibilityMode());
612   }
613
614   return LV;
615 }
616
617 static void clearLinkageForClass(const CXXRecordDecl *record) {
618   for (CXXRecordDecl::decl_iterator
619          i = record->decls_begin(), e = record->decls_end(); i != e; ++i) {
620     Decl *child = *i;
621     if (isa<NamedDecl>(child))
622       cast<NamedDecl>(child)->ClearLinkageCache();
623   }
624 }
625
626 void NamedDecl::ClearLinkageCache() {
627   // Note that we can't skip clearing the linkage of children just
628   // because the parent doesn't have cached linkage:  we don't cache
629   // when computing linkage for parent contexts.
630
631   HasCachedLinkage = 0;
632
633   // If we're changing the linkage of a class, we need to reset the
634   // linkage of child declarations, too.
635   if (const CXXRecordDecl *record = dyn_cast<CXXRecordDecl>(this))
636     clearLinkageForClass(record);
637
638   if (ClassTemplateDecl *temp =
639         dyn_cast<ClassTemplateDecl>(const_cast<NamedDecl*>(this))) {
640     // Clear linkage for the template pattern.
641     CXXRecordDecl *record = temp->getTemplatedDecl();
642     record->HasCachedLinkage = 0;
643     clearLinkageForClass(record);
644
645     // We need to clear linkage for specializations, too.
646     for (ClassTemplateDecl::spec_iterator
647            i = temp->spec_begin(), e = temp->spec_end(); i != e; ++i)
648       i->ClearLinkageCache();
649   }
650
651   // Clear cached linkage for function template decls, too.
652   if (FunctionTemplateDecl *temp =
653         dyn_cast<FunctionTemplateDecl>(const_cast<NamedDecl*>(this))) {
654     temp->getTemplatedDecl()->ClearLinkageCache();
655     for (FunctionTemplateDecl::spec_iterator
656            i = temp->spec_begin(), e = temp->spec_end(); i != e; ++i)
657       i->ClearLinkageCache();
658   }
659     
660 }
661
662 Linkage NamedDecl::getLinkage() const {
663   if (HasCachedLinkage) {
664     assert(Linkage(CachedLinkage) ==
665              getLVForDecl(this, LVFlags::CreateOnlyDeclLinkage()).linkage());
666     return Linkage(CachedLinkage);
667   }
668
669   CachedLinkage = getLVForDecl(this, 
670                                LVFlags::CreateOnlyDeclLinkage()).linkage();
671   HasCachedLinkage = 1;
672   return Linkage(CachedLinkage);
673 }
674
675 LinkageInfo NamedDecl::getLinkageAndVisibility() const {
676   LinkageInfo LI = getLVForDecl(this, LVFlags());
677   assert(!HasCachedLinkage || Linkage(CachedLinkage) == LI.linkage());
678   HasCachedLinkage = 1;
679   CachedLinkage = LI.linkage();
680   return LI;
681 }
682
683 llvm::Optional<Visibility> NamedDecl::getExplicitVisibility() const {
684   // Use the most recent declaration of a variable.
685   if (const VarDecl *var = dyn_cast<VarDecl>(this))
686     return getVisibilityOf(var->getMostRecentDeclaration());
687
688   // Use the most recent declaration of a function, and also handle
689   // function template specializations.
690   if (const FunctionDecl *fn = dyn_cast<FunctionDecl>(this)) {
691     if (llvm::Optional<Visibility> V
692                             = getVisibilityOf(fn->getMostRecentDeclaration())) 
693       return V;
694
695     // If the function is a specialization of a template with an
696     // explicit visibility attribute, use that.
697     if (FunctionTemplateSpecializationInfo *templateInfo
698           = fn->getTemplateSpecializationInfo())
699       return getVisibilityOf(templateInfo->getTemplate()->getTemplatedDecl());
700
701     return llvm::Optional<Visibility>();
702   }
703
704   // Otherwise, just check the declaration itself first.
705   if (llvm::Optional<Visibility> V = getVisibilityOf(this))
706     return V;
707
708   // If there wasn't explicit visibility there, and this is a
709   // specialization of a class template, check for visibility
710   // on the pattern.
711   if (const ClassTemplateSpecializationDecl *spec
712         = dyn_cast<ClassTemplateSpecializationDecl>(this))
713     return getVisibilityOf(spec->getSpecializedTemplate()->getTemplatedDecl());
714
715   return llvm::Optional<Visibility>();
716 }
717
718 static LinkageInfo getLVForDecl(const NamedDecl *D, LVFlags Flags) {
719   // Objective-C: treat all Objective-C declarations as having external
720   // linkage.
721   switch (D->getKind()) {
722     default:
723       break;
724     case Decl::TemplateTemplateParm: // count these as external
725     case Decl::NonTypeTemplateParm:
726     case Decl::ObjCAtDefsField:
727     case Decl::ObjCCategory:
728     case Decl::ObjCCategoryImpl:
729     case Decl::ObjCCompatibleAlias:
730     case Decl::ObjCForwardProtocol:
731     case Decl::ObjCImplementation:
732     case Decl::ObjCMethod:
733     case Decl::ObjCProperty:
734     case Decl::ObjCPropertyImpl:
735     case Decl::ObjCProtocol:
736       return LinkageInfo::external();
737   }
738
739   // Handle linkage for namespace-scope names.
740   if (D->getDeclContext()->getRedeclContext()->isFileContext())
741     return getLVForNamespaceScopeDecl(D, Flags);
742   
743   // C++ [basic.link]p5:
744   //   In addition, a member function, static data member, a named
745   //   class or enumeration of class scope, or an unnamed class or
746   //   enumeration defined in a class-scope typedef declaration such
747   //   that the class or enumeration has the typedef name for linkage
748   //   purposes (7.1.3), has external linkage if the name of the class
749   //   has external linkage.
750   if (D->getDeclContext()->isRecord())
751     return getLVForClassMember(D, Flags);
752
753   // C++ [basic.link]p6:
754   //   The name of a function declared in block scope and the name of
755   //   an object declared by a block scope extern declaration have
756   //   linkage. If there is a visible declaration of an entity with
757   //   linkage having the same name and type, ignoring entities
758   //   declared outside the innermost enclosing namespace scope, the
759   //   block scope declaration declares that same entity and receives
760   //   the linkage of the previous declaration. If there is more than
761   //   one such matching entity, the program is ill-formed. Otherwise,
762   //   if no matching entity is found, the block scope entity receives
763   //   external linkage.
764   if (D->getLexicalDeclContext()->isFunctionOrMethod()) {
765     if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
766       if (Function->isInAnonymousNamespace() && !Function->isExternC())
767         return LinkageInfo::uniqueExternal();
768
769       LinkageInfo LV;
770       if (Flags.ConsiderVisibilityAttributes) {
771         if (llvm::Optional<Visibility> Vis = Function->getExplicitVisibility())
772           LV.setVisibility(*Vis);
773       }
774       
775       if (const FunctionDecl *Prev = Function->getPreviousDeclaration()) {
776         LinkageInfo PrevLV = getLVForDecl(Prev, Flags);
777         if (PrevLV.linkage()) LV.setLinkage(PrevLV.linkage());
778         LV.mergeVisibility(PrevLV);
779       }
780
781       return LV;
782     }
783
784     if (const VarDecl *Var = dyn_cast<VarDecl>(D))
785       if (Var->getStorageClass() == SC_Extern ||
786           Var->getStorageClass() == SC_PrivateExtern) {
787         if (Var->isInAnonymousNamespace() && !Var->isExternC())
788           return LinkageInfo::uniqueExternal();
789
790         LinkageInfo LV;
791         if (Var->getStorageClass() == SC_PrivateExtern)
792           LV.setVisibility(HiddenVisibility);
793         else if (Flags.ConsiderVisibilityAttributes) {
794           if (llvm::Optional<Visibility> Vis = Var->getExplicitVisibility())
795             LV.setVisibility(*Vis);
796         }
797         
798         if (const VarDecl *Prev = Var->getPreviousDeclaration()) {
799           LinkageInfo PrevLV = getLVForDecl(Prev, Flags);
800           if (PrevLV.linkage()) LV.setLinkage(PrevLV.linkage());
801           LV.mergeVisibility(PrevLV);
802         }
803
804         return LV;
805       }
806   }
807
808   // C++ [basic.link]p6:
809   //   Names not covered by these rules have no linkage.
810   return LinkageInfo::none();
811 }
812
813 std::string NamedDecl::getQualifiedNameAsString() const {
814   return getQualifiedNameAsString(getASTContext().getLangOptions());
815 }
816
817 std::string NamedDecl::getQualifiedNameAsString(const PrintingPolicy &P) const {
818   const DeclContext *Ctx = getDeclContext();
819
820   if (Ctx->isFunctionOrMethod())
821     return getNameAsString();
822
823   typedef SmallVector<const DeclContext *, 8> ContextsTy;
824   ContextsTy Contexts;
825
826   // Collect contexts.
827   while (Ctx && isa<NamedDecl>(Ctx)) {
828     Contexts.push_back(Ctx);
829     Ctx = Ctx->getParent();
830   };
831
832   std::string QualName;
833   llvm::raw_string_ostream OS(QualName);
834
835   for (ContextsTy::reverse_iterator I = Contexts.rbegin(), E = Contexts.rend();
836        I != E; ++I) {
837     if (const ClassTemplateSpecializationDecl *Spec
838           = dyn_cast<ClassTemplateSpecializationDecl>(*I)) {
839       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
840       std::string TemplateArgsStr
841         = TemplateSpecializationType::PrintTemplateArgumentList(
842                                            TemplateArgs.data(),
843                                            TemplateArgs.size(),
844                                            P);
845       OS << Spec->getName() << TemplateArgsStr;
846     } else if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(*I)) {
847       if (ND->isAnonymousNamespace())
848         OS << "<anonymous namespace>";
849       else
850         OS << *ND;
851     } else if (const RecordDecl *RD = dyn_cast<RecordDecl>(*I)) {
852       if (!RD->getIdentifier())
853         OS << "<anonymous " << RD->getKindName() << '>';
854       else
855         OS << *RD;
856     } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
857       const FunctionProtoType *FT = 0;
858       if (FD->hasWrittenPrototype())
859         FT = dyn_cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>());
860
861       OS << *FD << '(';
862       if (FT) {
863         unsigned NumParams = FD->getNumParams();
864         for (unsigned i = 0; i < NumParams; ++i) {
865           if (i)
866             OS << ", ";
867           std::string Param;
868           FD->getParamDecl(i)->getType().getAsStringInternal(Param, P);
869           OS << Param;
870         }
871
872         if (FT->isVariadic()) {
873           if (NumParams > 0)
874             OS << ", ";
875           OS << "...";
876         }
877       }
878       OS << ')';
879     } else {
880       OS << *cast<NamedDecl>(*I);
881     }
882     OS << "::";
883   }
884
885   if (getDeclName())
886     OS << *this;
887   else
888     OS << "<anonymous>";
889
890   return OS.str();
891 }
892
893 bool NamedDecl::declarationReplaces(NamedDecl *OldD) const {
894   assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
895
896   // UsingDirectiveDecl's are not really NamedDecl's, and all have same name.
897   // We want to keep it, unless it nominates same namespace.
898   if (getKind() == Decl::UsingDirective) {
899     return cast<UsingDirectiveDecl>(this)->getNominatedNamespace()
900              ->getOriginalNamespace() ==
901            cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace()
902              ->getOriginalNamespace();
903   }
904
905   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
906     // For function declarations, we keep track of redeclarations.
907     return FD->getPreviousDeclaration() == OldD;
908
909   // For function templates, the underlying function declarations are linked.
910   if (const FunctionTemplateDecl *FunctionTemplate
911         = dyn_cast<FunctionTemplateDecl>(this))
912     if (const FunctionTemplateDecl *OldFunctionTemplate
913           = dyn_cast<FunctionTemplateDecl>(OldD))
914       return FunctionTemplate->getTemplatedDecl()
915                ->declarationReplaces(OldFunctionTemplate->getTemplatedDecl());
916
917   // For method declarations, we keep track of redeclarations.
918   if (isa<ObjCMethodDecl>(this))
919     return false;
920
921   if (isa<ObjCInterfaceDecl>(this) && isa<ObjCCompatibleAliasDecl>(OldD))
922     return true;
923
924   if (isa<UsingShadowDecl>(this) && isa<UsingShadowDecl>(OldD))
925     return cast<UsingShadowDecl>(this)->getTargetDecl() ==
926            cast<UsingShadowDecl>(OldD)->getTargetDecl();
927
928   if (isa<UsingDecl>(this) && isa<UsingDecl>(OldD)) {
929     ASTContext &Context = getASTContext();
930     return Context.getCanonicalNestedNameSpecifier(
931                                      cast<UsingDecl>(this)->getQualifier()) ==
932            Context.getCanonicalNestedNameSpecifier(
933                                         cast<UsingDecl>(OldD)->getQualifier());
934   }
935
936   // For non-function declarations, if the declarations are of the
937   // same kind then this must be a redeclaration, or semantic analysis
938   // would not have given us the new declaration.
939   return this->getKind() == OldD->getKind();
940 }
941
942 bool NamedDecl::hasLinkage() const {
943   return getLinkage() != NoLinkage;
944 }
945
946 NamedDecl *NamedDecl::getUnderlyingDecl() {
947   NamedDecl *ND = this;
948   while (true) {
949     if (UsingShadowDecl *UD = dyn_cast<UsingShadowDecl>(ND))
950       ND = UD->getTargetDecl();
951     else if (ObjCCompatibleAliasDecl *AD
952               = dyn_cast<ObjCCompatibleAliasDecl>(ND))
953       return AD->getClassInterface();
954     else
955       return ND;
956   }
957 }
958
959 bool NamedDecl::isCXXInstanceMember() const {
960   assert(isCXXClassMember() &&
961          "checking whether non-member is instance member");
962
963   const NamedDecl *D = this;
964   if (isa<UsingShadowDecl>(D))
965     D = cast<UsingShadowDecl>(D)->getTargetDecl();
966
967   if (isa<FieldDecl>(D) || isa<IndirectFieldDecl>(D))
968     return true;
969   if (isa<CXXMethodDecl>(D))
970     return cast<CXXMethodDecl>(D)->isInstance();
971   if (isa<FunctionTemplateDecl>(D))
972     return cast<CXXMethodDecl>(cast<FunctionTemplateDecl>(D)
973                                  ->getTemplatedDecl())->isInstance();
974   return false;
975 }
976
977 //===----------------------------------------------------------------------===//
978 // DeclaratorDecl Implementation
979 //===----------------------------------------------------------------------===//
980
981 template <typename DeclT>
982 static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl) {
983   if (decl->getNumTemplateParameterLists() > 0)
984     return decl->getTemplateParameterList(0)->getTemplateLoc();
985   else
986     return decl->getInnerLocStart();
987 }
988
989 SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const {
990   TypeSourceInfo *TSI = getTypeSourceInfo();
991   if (TSI) return TSI->getTypeLoc().getBeginLoc();
992   return SourceLocation();
993 }
994
995 void DeclaratorDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) {
996   if (QualifierLoc) {
997     // Make sure the extended decl info is allocated.
998     if (!hasExtInfo()) {
999       // Save (non-extended) type source info pointer.
1000       TypeSourceInfo *savedTInfo = DeclInfo.get<TypeSourceInfo*>();
1001       // Allocate external info struct.
1002       DeclInfo = new (getASTContext()) ExtInfo;
1003       // Restore savedTInfo into (extended) decl info.
1004       getExtInfo()->TInfo = savedTInfo;
1005     }
1006     // Set qualifier info.
1007     getExtInfo()->QualifierLoc = QualifierLoc;
1008   } else {
1009     // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
1010     if (hasExtInfo()) {
1011       if (getExtInfo()->NumTemplParamLists == 0) {
1012         // Save type source info pointer.
1013         TypeSourceInfo *savedTInfo = getExtInfo()->TInfo;
1014         // Deallocate the extended decl info.
1015         getASTContext().Deallocate(getExtInfo());
1016         // Restore savedTInfo into (non-extended) decl info.
1017         DeclInfo = savedTInfo;
1018       }
1019       else
1020         getExtInfo()->QualifierLoc = QualifierLoc;
1021     }
1022   }
1023 }
1024
1025 void
1026 DeclaratorDecl::setTemplateParameterListsInfo(ASTContext &Context,
1027                                               unsigned NumTPLists,
1028                                               TemplateParameterList **TPLists) {
1029   assert(NumTPLists > 0);
1030   // Make sure the extended decl info is allocated.
1031   if (!hasExtInfo()) {
1032     // Save (non-extended) type source info pointer.
1033     TypeSourceInfo *savedTInfo = DeclInfo.get<TypeSourceInfo*>();
1034     // Allocate external info struct.
1035     DeclInfo = new (getASTContext()) ExtInfo;
1036     // Restore savedTInfo into (extended) decl info.
1037     getExtInfo()->TInfo = savedTInfo;
1038   }
1039   // Set the template parameter lists info.
1040   getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists);
1041 }
1042
1043 SourceLocation DeclaratorDecl::getOuterLocStart() const {
1044   return getTemplateOrInnerLocStart(this);
1045 }
1046
1047 namespace {
1048
1049 // Helper function: returns true if QT is or contains a type
1050 // having a postfix component.
1051 bool typeIsPostfix(clang::QualType QT) {
1052   while (true) {
1053     const Type* T = QT.getTypePtr();
1054     switch (T->getTypeClass()) {
1055     default:
1056       return false;
1057     case Type::Pointer:
1058       QT = cast<PointerType>(T)->getPointeeType();
1059       break;
1060     case Type::BlockPointer:
1061       QT = cast<BlockPointerType>(T)->getPointeeType();
1062       break;
1063     case Type::MemberPointer:
1064       QT = cast<MemberPointerType>(T)->getPointeeType();
1065       break;
1066     case Type::LValueReference:
1067     case Type::RValueReference:
1068       QT = cast<ReferenceType>(T)->getPointeeType();
1069       break;
1070     case Type::PackExpansion:
1071       QT = cast<PackExpansionType>(T)->getPattern();
1072       break;
1073     case Type::Paren:
1074     case Type::ConstantArray:
1075     case Type::DependentSizedArray:
1076     case Type::IncompleteArray:
1077     case Type::VariableArray:
1078     case Type::FunctionProto:
1079     case Type::FunctionNoProto:
1080       return true;
1081     }
1082   }
1083 }
1084
1085 } // namespace
1086
1087 SourceRange DeclaratorDecl::getSourceRange() const {
1088   SourceLocation RangeEnd = getLocation();
1089   if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
1090     if (typeIsPostfix(TInfo->getType()))
1091       RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
1092   }
1093   return SourceRange(getOuterLocStart(), RangeEnd);
1094 }
1095
1096 void
1097 QualifierInfo::setTemplateParameterListsInfo(ASTContext &Context,
1098                                              unsigned NumTPLists,
1099                                              TemplateParameterList **TPLists) {
1100   assert((NumTPLists == 0 || TPLists != 0) &&
1101          "Empty array of template parameters with positive size!");
1102
1103   // Free previous template parameters (if any).
1104   if (NumTemplParamLists > 0) {
1105     Context.Deallocate(TemplParamLists);
1106     TemplParamLists = 0;
1107     NumTemplParamLists = 0;
1108   }
1109   // Set info on matched template parameter lists (if any).
1110   if (NumTPLists > 0) {
1111     TemplParamLists = new (Context) TemplateParameterList*[NumTPLists];
1112     NumTemplParamLists = NumTPLists;
1113     for (unsigned i = NumTPLists; i-- > 0; )
1114       TemplParamLists[i] = TPLists[i];
1115   }
1116 }
1117
1118 //===----------------------------------------------------------------------===//
1119 // VarDecl Implementation
1120 //===----------------------------------------------------------------------===//
1121
1122 const char *VarDecl::getStorageClassSpecifierString(StorageClass SC) {
1123   switch (SC) {
1124   case SC_None:                 break;
1125   case SC_Auto:                 return "auto";
1126   case SC_Extern:               return "extern";
1127   case SC_OpenCLWorkGroupLocal: return "<<work-group-local>>";
1128   case SC_PrivateExtern:        return "__private_extern__";
1129   case SC_Register:             return "register";
1130   case SC_Static:               return "static";
1131   }
1132
1133   llvm_unreachable("Invalid storage class");
1134   return 0;
1135 }
1136
1137 VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC,
1138                          SourceLocation StartL, SourceLocation IdL,
1139                          IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
1140                          StorageClass S, StorageClass SCAsWritten) {
1141   return new (C) VarDecl(Var, DC, StartL, IdL, Id, T, TInfo, S, SCAsWritten);
1142 }
1143
1144 void VarDecl::setStorageClass(StorageClass SC) {
1145   assert(isLegalForVariable(SC));
1146   if (getStorageClass() != SC)
1147     ClearLinkageCache();
1148   
1149   VarDeclBits.SClass = SC;
1150 }
1151
1152 SourceRange VarDecl::getSourceRange() const {
1153   if (getInit())
1154     return SourceRange(getOuterLocStart(), getInit()->getLocEnd());
1155   return DeclaratorDecl::getSourceRange();
1156 }
1157
1158 bool VarDecl::isExternC() const {
1159   ASTContext &Context = getASTContext();
1160   if (!Context.getLangOptions().CPlusPlus)
1161     return (getDeclContext()->isTranslationUnit() &&
1162             getStorageClass() != SC_Static) ||
1163       (getDeclContext()->isFunctionOrMethod() && hasExternalStorage());
1164
1165   const DeclContext *DC = getDeclContext();
1166   if (DC->isFunctionOrMethod())
1167     return false;
1168
1169   for (; !DC->isTranslationUnit(); DC = DC->getParent()) {
1170     if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {
1171       if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)
1172         return getStorageClass() != SC_Static;
1173
1174       break;
1175     }
1176
1177   }
1178
1179   return false;
1180 }
1181
1182 VarDecl *VarDecl::getCanonicalDecl() {
1183   return getFirstDeclaration();
1184 }
1185
1186 VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition() const {
1187   // C++ [basic.def]p2:
1188   //   A declaration is a definition unless [...] it contains the 'extern'
1189   //   specifier or a linkage-specification and neither an initializer [...],
1190   //   it declares a static data member in a class declaration [...].
1191   // C++ [temp.expl.spec]p15:
1192   //   An explicit specialization of a static data member of a template is a
1193   //   definition if the declaration includes an initializer; otherwise, it is
1194   //   a declaration.
1195   if (isStaticDataMember()) {
1196     if (isOutOfLine() && (hasInit() ||
1197           getTemplateSpecializationKind() != TSK_ExplicitSpecialization))
1198       return Definition;
1199     else
1200       return DeclarationOnly;
1201   }
1202   // C99 6.7p5:
1203   //   A definition of an identifier is a declaration for that identifier that
1204   //   [...] causes storage to be reserved for that object.
1205   // Note: that applies for all non-file-scope objects.
1206   // C99 6.9.2p1:
1207   //   If the declaration of an identifier for an object has file scope and an
1208   //   initializer, the declaration is an external definition for the identifier
1209   if (hasInit())
1210     return Definition;
1211   // AST for 'extern "C" int foo;' is annotated with 'extern'.
1212   if (hasExternalStorage())
1213     return DeclarationOnly;
1214   
1215   if (getStorageClassAsWritten() == SC_Extern ||
1216        getStorageClassAsWritten() == SC_PrivateExtern) {
1217     for (const VarDecl *PrevVar = getPreviousDeclaration();
1218          PrevVar; PrevVar = PrevVar->getPreviousDeclaration()) {
1219       if (PrevVar->getLinkage() == InternalLinkage && PrevVar->hasInit())
1220         return DeclarationOnly;
1221     }
1222   }
1223   // C99 6.9.2p2:
1224   //   A declaration of an object that has file scope without an initializer,
1225   //   and without a storage class specifier or the scs 'static', constitutes
1226   //   a tentative definition.
1227   // No such thing in C++.
1228   if (!getASTContext().getLangOptions().CPlusPlus && isFileVarDecl())
1229     return TentativeDefinition;
1230
1231   // What's left is (in C, block-scope) declarations without initializers or
1232   // external storage. These are definitions.
1233   return Definition;
1234 }
1235
1236 VarDecl *VarDecl::getActingDefinition() {
1237   DefinitionKind Kind = isThisDeclarationADefinition();
1238   if (Kind != TentativeDefinition)
1239     return 0;
1240
1241   VarDecl *LastTentative = 0;
1242   VarDecl *First = getFirstDeclaration();
1243   for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end();
1244        I != E; ++I) {
1245     Kind = (*I)->isThisDeclarationADefinition();
1246     if (Kind == Definition)
1247       return 0;
1248     else if (Kind == TentativeDefinition)
1249       LastTentative = *I;
1250   }
1251   return LastTentative;
1252 }
1253
1254 bool VarDecl::isTentativeDefinitionNow() const {
1255   DefinitionKind Kind = isThisDeclarationADefinition();
1256   if (Kind != TentativeDefinition)
1257     return false;
1258
1259   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
1260     if ((*I)->isThisDeclarationADefinition() == Definition)
1261       return false;
1262   }
1263   return true;
1264 }
1265
1266 VarDecl *VarDecl::getDefinition() {
1267   VarDecl *First = getFirstDeclaration();
1268   for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end();
1269        I != E; ++I) {
1270     if ((*I)->isThisDeclarationADefinition() == Definition)
1271       return *I;
1272   }
1273   return 0;
1274 }
1275
1276 VarDecl::DefinitionKind VarDecl::hasDefinition() const {
1277   DefinitionKind Kind = DeclarationOnly;
1278   
1279   const VarDecl *First = getFirstDeclaration();
1280   for (redecl_iterator I = First->redecls_begin(), E = First->redecls_end();
1281        I != E; ++I)
1282     Kind = std::max(Kind, (*I)->isThisDeclarationADefinition());
1283
1284   return Kind;
1285 }
1286
1287 const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const {
1288   redecl_iterator I = redecls_begin(), E = redecls_end();
1289   while (I != E && !I->getInit())
1290     ++I;
1291
1292   if (I != E) {
1293     D = *I;
1294     return I->getInit();
1295   }
1296   return 0;
1297 }
1298
1299 bool VarDecl::isOutOfLine() const {
1300   if (Decl::isOutOfLine())
1301     return true;
1302
1303   if (!isStaticDataMember())
1304     return false;
1305
1306   // If this static data member was instantiated from a static data member of
1307   // a class template, check whether that static data member was defined 
1308   // out-of-line.
1309   if (VarDecl *VD = getInstantiatedFromStaticDataMember())
1310     return VD->isOutOfLine();
1311   
1312   return false;
1313 }
1314
1315 VarDecl *VarDecl::getOutOfLineDefinition() {
1316   if (!isStaticDataMember())
1317     return 0;
1318   
1319   for (VarDecl::redecl_iterator RD = redecls_begin(), RDEnd = redecls_end();
1320        RD != RDEnd; ++RD) {
1321     if (RD->getLexicalDeclContext()->isFileContext())
1322       return *RD;
1323   }
1324   
1325   return 0;
1326 }
1327
1328 void VarDecl::setInit(Expr *I) {
1329   if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) {
1330     Eval->~EvaluatedStmt();
1331     getASTContext().Deallocate(Eval);
1332   }
1333
1334   Init = I;
1335 }
1336
1337 bool VarDecl::extendsLifetimeOfTemporary() const {
1338   assert(getType()->isReferenceType() &&"Non-references never extend lifetime");
1339   
1340   const Expr *E = getInit();
1341   if (!E)
1342     return false;
1343   
1344   if (const ExprWithCleanups *Cleanups = dyn_cast<ExprWithCleanups>(E))
1345     E = Cleanups->getSubExpr();
1346   
1347   return isa<MaterializeTemporaryExpr>(E);
1348 }
1349
1350 VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const {
1351   if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
1352     return cast<VarDecl>(MSI->getInstantiatedFrom());
1353   
1354   return 0;
1355 }
1356
1357 TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() const {
1358   if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
1359     return MSI->getTemplateSpecializationKind();
1360   
1361   return TSK_Undeclared;
1362 }
1363
1364 MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const {
1365   return getASTContext().getInstantiatedFromStaticDataMember(this);
1366 }
1367
1368 void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
1369                                          SourceLocation PointOfInstantiation) {
1370   MemberSpecializationInfo *MSI = getMemberSpecializationInfo();
1371   assert(MSI && "Not an instantiated static data member?");
1372   MSI->setTemplateSpecializationKind(TSK);
1373   if (TSK != TSK_ExplicitSpecialization &&
1374       PointOfInstantiation.isValid() &&
1375       MSI->getPointOfInstantiation().isInvalid())
1376     MSI->setPointOfInstantiation(PointOfInstantiation);
1377 }
1378
1379 //===----------------------------------------------------------------------===//
1380 // ParmVarDecl Implementation
1381 //===----------------------------------------------------------------------===//
1382
1383 ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
1384                                  SourceLocation StartLoc,
1385                                  SourceLocation IdLoc, IdentifierInfo *Id,
1386                                  QualType T, TypeSourceInfo *TInfo,
1387                                  StorageClass S, StorageClass SCAsWritten,
1388                                  Expr *DefArg) {
1389   return new (C) ParmVarDecl(ParmVar, DC, StartLoc, IdLoc, Id, T, TInfo,
1390                              S, SCAsWritten, DefArg);
1391 }
1392
1393 SourceRange ParmVarDecl::getSourceRange() const {
1394   if (!hasInheritedDefaultArg()) {
1395     SourceRange ArgRange = getDefaultArgRange();
1396     if (ArgRange.isValid())
1397       return SourceRange(getOuterLocStart(), ArgRange.getEnd());
1398   }
1399
1400   return DeclaratorDecl::getSourceRange();
1401 }
1402
1403 Expr *ParmVarDecl::getDefaultArg() {
1404   assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!");
1405   assert(!hasUninstantiatedDefaultArg() &&
1406          "Default argument is not yet instantiated!");
1407   
1408   Expr *Arg = getInit();
1409   if (ExprWithCleanups *E = dyn_cast_or_null<ExprWithCleanups>(Arg))
1410     return E->getSubExpr();
1411
1412   return Arg;
1413 }
1414
1415 unsigned ParmVarDecl::getNumDefaultArgTemporaries() const {
1416   if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(getInit()))
1417     return E->getNumTemporaries();
1418
1419   return 0;
1420 }
1421
1422 CXXTemporary *ParmVarDecl::getDefaultArgTemporary(unsigned i) {
1423   assert(getNumDefaultArgTemporaries() && 
1424          "Default arguments does not have any temporaries!");
1425
1426   ExprWithCleanups *E = cast<ExprWithCleanups>(getInit());
1427   return E->getTemporary(i);
1428 }
1429
1430 SourceRange ParmVarDecl::getDefaultArgRange() const {
1431   if (const Expr *E = getInit())
1432     return E->getSourceRange();
1433
1434   if (hasUninstantiatedDefaultArg())
1435     return getUninstantiatedDefaultArg()->getSourceRange();
1436
1437   return SourceRange();
1438 }
1439
1440 bool ParmVarDecl::isParameterPack() const {
1441   return isa<PackExpansionType>(getType());
1442 }
1443
1444 void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) {
1445   getASTContext().setParameterIndex(this, parameterIndex);
1446   ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel;
1447 }
1448
1449 unsigned ParmVarDecl::getParameterIndexLarge() const {
1450   return getASTContext().getParameterIndex(this);
1451 }
1452
1453 //===----------------------------------------------------------------------===//
1454 // FunctionDecl Implementation
1455 //===----------------------------------------------------------------------===//
1456
1457 void FunctionDecl::getNameForDiagnostic(std::string &S,
1458                                         const PrintingPolicy &Policy,
1459                                         bool Qualified) const {
1460   NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
1461   const TemplateArgumentList *TemplateArgs = getTemplateSpecializationArgs();
1462   if (TemplateArgs)
1463     S += TemplateSpecializationType::PrintTemplateArgumentList(
1464                                                          TemplateArgs->data(),
1465                                                          TemplateArgs->size(),
1466                                                                Policy);
1467     
1468 }
1469
1470 bool FunctionDecl::isVariadic() const {
1471   if (const FunctionProtoType *FT = getType()->getAs<FunctionProtoType>())
1472     return FT->isVariadic();
1473   return false;
1474 }
1475
1476 bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const {
1477   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
1478     if (I->Body || I->IsLateTemplateParsed) {
1479       Definition = *I;
1480       return true;
1481     }
1482   }
1483
1484   return false;
1485 }
1486
1487 bool FunctionDecl::hasTrivialBody() const
1488 {
1489   Stmt *S = getBody();
1490   if (!S) {
1491     // Since we don't have a body for this function, we don't know if it's
1492     // trivial or not.
1493     return false;
1494   }
1495
1496   if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
1497     return true;
1498   return false;
1499 }
1500
1501 bool FunctionDecl::isDefined(const FunctionDecl *&Definition) const {
1502   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
1503     if (I->IsDeleted || I->IsDefaulted || I->Body || I->IsLateTemplateParsed) {
1504       Definition = I->IsDeleted ? I->getCanonicalDecl() : *I;
1505       return true;
1506     }
1507   }
1508
1509   return false;
1510 }
1511
1512 Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
1513   for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) {
1514     if (I->Body) {
1515       Definition = *I;
1516       return I->Body.get(getASTContext().getExternalSource());
1517     } else if (I->IsLateTemplateParsed) {
1518       Definition = *I;
1519       return 0;
1520     }
1521   }
1522
1523   return 0;
1524 }
1525
1526 void FunctionDecl::setBody(Stmt *B) {
1527   Body = B;
1528   if (B)
1529     EndRangeLoc = B->getLocEnd();
1530 }
1531
1532 void FunctionDecl::setPure(bool P) {
1533   IsPure = P;
1534   if (P)
1535     if (CXXRecordDecl *Parent = dyn_cast<CXXRecordDecl>(getDeclContext()))
1536       Parent->markedVirtualFunctionPure();
1537 }
1538
1539 bool FunctionDecl::isMain() const {
1540   const TranslationUnitDecl *tunit =
1541     dyn_cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext());
1542   return tunit &&
1543          !tunit->getASTContext().getLangOptions().Freestanding &&
1544          getIdentifier() &&
1545          getIdentifier()->isStr("main");
1546 }
1547
1548 bool FunctionDecl::isReservedGlobalPlacementOperator() const {
1549   assert(getDeclName().getNameKind() == DeclarationName::CXXOperatorName);
1550   assert(getDeclName().getCXXOverloadedOperator() == OO_New ||
1551          getDeclName().getCXXOverloadedOperator() == OO_Delete ||
1552          getDeclName().getCXXOverloadedOperator() == OO_Array_New ||
1553          getDeclName().getCXXOverloadedOperator() == OO_Array_Delete);
1554
1555   if (isa<CXXRecordDecl>(getDeclContext())) return false;
1556   assert(getDeclContext()->getRedeclContext()->isTranslationUnit());
1557
1558   const FunctionProtoType *proto = getType()->castAs<FunctionProtoType>();
1559   if (proto->getNumArgs() != 2 || proto->isVariadic()) return false;
1560
1561   ASTContext &Context =
1562     cast<TranslationUnitDecl>(getDeclContext()->getRedeclContext())
1563       ->getASTContext();
1564
1565   // The result type and first argument type are constant across all
1566   // these operators.  The second argument must be exactly void*.
1567   return (proto->getArgType(1).getCanonicalType() == Context.VoidPtrTy);
1568 }
1569
1570 bool FunctionDecl::isExternC() const {
1571   ASTContext &Context = getASTContext();
1572   // In C, any non-static, non-overloadable function has external
1573   // linkage.
1574   if (!Context.getLangOptions().CPlusPlus)
1575     return getStorageClass() != SC_Static && !getAttr<OverloadableAttr>();
1576
1577   const DeclContext *DC = getDeclContext();
1578   if (DC->isRecord())
1579     return false;
1580
1581   for (; !DC->isTranslationUnit(); DC = DC->getParent()) {
1582     if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {
1583       if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)
1584         return getStorageClass() != SC_Static &&
1585                !getAttr<OverloadableAttr>();
1586
1587       break;
1588     }
1589   }
1590
1591   return isMain();
1592 }
1593
1594 bool FunctionDecl::isGlobal() const {
1595   if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this))
1596     return Method->isStatic();
1597
1598   if (getStorageClass() == SC_Static)
1599     return false;
1600
1601   for (const DeclContext *DC = getDeclContext();
1602        DC->isNamespace();
1603        DC = DC->getParent()) {
1604     if (const NamespaceDecl *Namespace = cast<NamespaceDecl>(DC)) {
1605       if (!Namespace->getDeclName())
1606         return false;
1607       break;
1608     }
1609   }
1610
1611   return true;
1612 }
1613
1614 void
1615 FunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) {
1616   redeclarable_base::setPreviousDeclaration(PrevDecl);
1617
1618   if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) {
1619     FunctionTemplateDecl *PrevFunTmpl
1620       = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : 0;
1621     assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch");
1622     FunTmpl->setPreviousDeclaration(PrevFunTmpl);
1623   }
1624   
1625   if (PrevDecl->IsInline)
1626     IsInline = true;
1627 }
1628
1629 const FunctionDecl *FunctionDecl::getCanonicalDecl() const {
1630   return getFirstDeclaration();
1631 }
1632
1633 FunctionDecl *FunctionDecl::getCanonicalDecl() {
1634   return getFirstDeclaration();
1635 }
1636
1637 void FunctionDecl::setStorageClass(StorageClass SC) {
1638   assert(isLegalForFunction(SC));
1639   if (getStorageClass() != SC)
1640     ClearLinkageCache();
1641   
1642   SClass = SC;
1643 }
1644
1645 /// \brief Returns a value indicating whether this function
1646 /// corresponds to a builtin function.
1647 ///
1648 /// The function corresponds to a built-in function if it is
1649 /// declared at translation scope or within an extern "C" block and
1650 /// its name matches with the name of a builtin. The returned value
1651 /// will be 0 for functions that do not correspond to a builtin, a
1652 /// value of type \c Builtin::ID if in the target-independent range
1653 /// \c [1,Builtin::First), or a target-specific builtin value.
1654 unsigned FunctionDecl::getBuiltinID() const {
1655   ASTContext &Context = getASTContext();
1656   if (!getIdentifier() || !getIdentifier()->getBuiltinID())
1657     return 0;
1658
1659   unsigned BuiltinID = getIdentifier()->getBuiltinID();
1660   if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
1661     return BuiltinID;
1662
1663   // This function has the name of a known C library
1664   // function. Determine whether it actually refers to the C library
1665   // function or whether it just has the same name.
1666
1667   // If this is a static function, it's not a builtin.
1668   if (getStorageClass() == SC_Static)
1669     return 0;
1670
1671   // If this function is at translation-unit scope and we're not in
1672   // C++, it refers to the C library function.
1673   if (!Context.getLangOptions().CPlusPlus &&
1674       getDeclContext()->isTranslationUnit())
1675     return BuiltinID;
1676
1677   // If the function is in an extern "C" linkage specification and is
1678   // not marked "overloadable", it's the real function.
1679   if (isa<LinkageSpecDecl>(getDeclContext()) &&
1680       cast<LinkageSpecDecl>(getDeclContext())->getLanguage()
1681         == LinkageSpecDecl::lang_c &&
1682       !getAttr<OverloadableAttr>())
1683     return BuiltinID;
1684
1685   // Not a builtin
1686   return 0;
1687 }
1688
1689
1690 /// getNumParams - Return the number of parameters this function must have
1691 /// based on its FunctionType.  This is the length of the ParamInfo array
1692 /// after it has been created.
1693 unsigned FunctionDecl::getNumParams() const {
1694   const FunctionType *FT = getType()->getAs<FunctionType>();
1695   if (isa<FunctionNoProtoType>(FT))
1696     return 0;
1697   return cast<FunctionProtoType>(FT)->getNumArgs();
1698
1699 }
1700
1701 void FunctionDecl::setParams(ASTContext &C,
1702                              llvm::ArrayRef<ParmVarDecl *> NewParamInfo) {
1703   assert(ParamInfo == 0 && "Already has param info!");
1704   assert(NewParamInfo.size() == getNumParams() && "Parameter count mismatch!");
1705
1706   // Zero params -> null pointer.
1707   if (!NewParamInfo.empty()) {
1708     ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
1709     std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
1710   }
1711 }
1712
1713 /// getMinRequiredArguments - Returns the minimum number of arguments
1714 /// needed to call this function. This may be fewer than the number of
1715 /// function parameters, if some of the parameters have default
1716 /// arguments (in C++) or the last parameter is a parameter pack.
1717 unsigned FunctionDecl::getMinRequiredArguments() const {
1718   if (!getASTContext().getLangOptions().CPlusPlus)
1719     return getNumParams();
1720   
1721   unsigned NumRequiredArgs = getNumParams();  
1722   
1723   // If the last parameter is a parameter pack, we don't need an argument for 
1724   // it.
1725   if (NumRequiredArgs > 0 &&
1726       getParamDecl(NumRequiredArgs - 1)->isParameterPack())
1727     --NumRequiredArgs;
1728       
1729   // If this parameter has a default argument, we don't need an argument for
1730   // it.
1731   while (NumRequiredArgs > 0 &&
1732          getParamDecl(NumRequiredArgs-1)->hasDefaultArg())
1733     --NumRequiredArgs;
1734
1735   // We might have parameter packs before the end. These can't be deduced,
1736   // but they can still handle multiple arguments.
1737   unsigned ArgIdx = NumRequiredArgs;
1738   while (ArgIdx > 0) {
1739     if (getParamDecl(ArgIdx - 1)->isParameterPack())
1740       NumRequiredArgs = ArgIdx;
1741     
1742     --ArgIdx;
1743   }
1744   
1745   return NumRequiredArgs;
1746 }
1747
1748 bool FunctionDecl::isInlined() const {
1749   if (IsInline)
1750     return true;
1751   
1752   if (isa<CXXMethodDecl>(this)) {
1753     if (!isOutOfLine() || getCanonicalDecl()->isInlineSpecified())
1754       return true;
1755   }
1756
1757   switch (getTemplateSpecializationKind()) {
1758   case TSK_Undeclared:
1759   case TSK_ExplicitSpecialization:
1760     return false;
1761
1762   case TSK_ImplicitInstantiation:
1763   case TSK_ExplicitInstantiationDeclaration:
1764   case TSK_ExplicitInstantiationDefinition:
1765     // Handle below.
1766     break;
1767   }
1768
1769   const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
1770   bool HasPattern = false;
1771   if (PatternDecl)
1772     HasPattern = PatternDecl->hasBody(PatternDecl);
1773   
1774   if (HasPattern && PatternDecl)
1775     return PatternDecl->isInlined();
1776   
1777   return false;
1778 }
1779
1780 /// \brief For a function declaration in C or C++, determine whether this
1781 /// declaration causes the definition to be externally visible.
1782 ///
1783 /// Determines whether this is the first non-inline redeclaration of an inline
1784 /// function in a language where "inline" does not normally require an
1785 /// externally visible definition.
1786 bool FunctionDecl::doesDeclarationForceExternallyVisibleDefinition() const {
1787   assert(!doesThisDeclarationHaveABody() &&
1788          "Must have a declaration without a body.");
1789
1790   ASTContext &Context = getASTContext();
1791
1792   // In C99 mode, a function may have an inline definition (causing it to
1793   // be deferred) then redeclared later.  As a special case, "extern inline"
1794   // is not required to produce an external symbol.
1795   if (Context.getLangOptions().GNUInline || !Context.getLangOptions().C99 ||
1796       Context.getLangOptions().CPlusPlus)
1797     return false;
1798   if (getLinkage() != ExternalLinkage || isInlineSpecified())
1799     return false;
1800   const FunctionDecl *Definition = 0;
1801   if (hasBody(Definition))
1802     return Definition->isInlined() &&
1803            Definition->isInlineDefinitionExternallyVisible();
1804   return false;
1805 }
1806
1807 /// \brief For an inline function definition in C or C++, determine whether the 
1808 /// definition will be externally visible.
1809 ///
1810 /// Inline function definitions are always available for inlining optimizations.
1811 /// However, depending on the language dialect, declaration specifiers, and
1812 /// attributes, the definition of an inline function may or may not be
1813 /// "externally" visible to other translation units in the program.
1814 ///
1815 /// In C99, inline definitions are not externally visible by default. However,
1816 /// if even one of the global-scope declarations is marked "extern inline", the
1817 /// inline definition becomes externally visible (C99 6.7.4p6).
1818 ///
1819 /// In GNU89 mode, or if the gnu_inline attribute is attached to the function
1820 /// definition, we use the GNU semantics for inline, which are nearly the 
1821 /// opposite of C99 semantics. In particular, "inline" by itself will create 
1822 /// an externally visible symbol, but "extern inline" will not create an 
1823 /// externally visible symbol.
1824 bool FunctionDecl::isInlineDefinitionExternallyVisible() const {
1825   assert(doesThisDeclarationHaveABody() && "Must have the function definition");
1826   assert(isInlined() && "Function must be inline");
1827   ASTContext &Context = getASTContext();
1828   
1829   if (Context.getLangOptions().GNUInline || hasAttr<GNUInlineAttr>()) {
1830     // If it's not the case that both 'inline' and 'extern' are
1831     // specified on the definition, then this inline definition is
1832     // externally visible.
1833     if (!(isInlineSpecified() && getStorageClassAsWritten() == SC_Extern))
1834       return true;
1835     
1836     // If any declaration is 'inline' but not 'extern', then this definition
1837     // is externally visible.
1838     for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end();
1839          Redecl != RedeclEnd;
1840          ++Redecl) {
1841       if (Redecl->isInlineSpecified() && 
1842           Redecl->getStorageClassAsWritten() != SC_Extern)
1843         return true;
1844     }    
1845     
1846     return false;
1847   }
1848   
1849   // C99 6.7.4p6:
1850   //   [...] If all of the file scope declarations for a function in a 
1851   //   translation unit include the inline function specifier without extern, 
1852   //   then the definition in that translation unit is an inline definition.
1853   for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end();
1854        Redecl != RedeclEnd;
1855        ++Redecl) {
1856     // Only consider file-scope declarations in this test.
1857     if (!Redecl->getLexicalDeclContext()->isTranslationUnit())
1858       continue;
1859
1860     // Only consider explicit declarations; the presence of a builtin for a
1861     // libcall shouldn't affect whether a definition is externally visible.
1862     if (Redecl->isImplicit())
1863       continue;
1864
1865     if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern) 
1866       return true; // Not an inline definition
1867   }
1868   
1869   // C99 6.7.4p6:
1870   //   An inline definition does not provide an external definition for the 
1871   //   function, and does not forbid an external definition in another 
1872   //   translation unit.
1873   return false;
1874 }
1875
1876 /// getOverloadedOperator - Which C++ overloaded operator this
1877 /// function represents, if any.
1878 OverloadedOperatorKind FunctionDecl::getOverloadedOperator() const {
1879   if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
1880     return getDeclName().getCXXOverloadedOperator();
1881   else
1882     return OO_None;
1883 }
1884
1885 /// getLiteralIdentifier - The literal suffix identifier this function
1886 /// represents, if any.
1887 const IdentifierInfo *FunctionDecl::getLiteralIdentifier() const {
1888   if (getDeclName().getNameKind() == DeclarationName::CXXLiteralOperatorName)
1889     return getDeclName().getCXXLiteralIdentifier();
1890   else
1891     return 0;
1892 }
1893
1894 FunctionDecl::TemplatedKind FunctionDecl::getTemplatedKind() const {
1895   if (TemplateOrSpecialization.isNull())
1896     return TK_NonTemplate;
1897   if (TemplateOrSpecialization.is<FunctionTemplateDecl *>())
1898     return TK_FunctionTemplate;
1899   if (TemplateOrSpecialization.is<MemberSpecializationInfo *>())
1900     return TK_MemberSpecialization;
1901   if (TemplateOrSpecialization.is<FunctionTemplateSpecializationInfo *>())
1902     return TK_FunctionTemplateSpecialization;
1903   if (TemplateOrSpecialization.is
1904                                <DependentFunctionTemplateSpecializationInfo*>())
1905     return TK_DependentFunctionTemplateSpecialization;
1906
1907   llvm_unreachable("Did we miss a TemplateOrSpecialization type?");
1908 }
1909
1910 FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const {
1911   if (MemberSpecializationInfo *Info = getMemberSpecializationInfo())
1912     return cast<FunctionDecl>(Info->getInstantiatedFrom());
1913   
1914   return 0;
1915 }
1916
1917 MemberSpecializationInfo *FunctionDecl::getMemberSpecializationInfo() const {
1918   return TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>();
1919 }
1920
1921 void 
1922 FunctionDecl::setInstantiationOfMemberFunction(ASTContext &C,
1923                                                FunctionDecl *FD,
1924                                                TemplateSpecializationKind TSK) {
1925   assert(TemplateOrSpecialization.isNull() && 
1926          "Member function is already a specialization");
1927   MemberSpecializationInfo *Info 
1928     = new (C) MemberSpecializationInfo(FD, TSK);
1929   TemplateOrSpecialization = Info;
1930 }
1931
1932 bool FunctionDecl::isImplicitlyInstantiable() const {
1933   // If the function is invalid, it can't be implicitly instantiated.
1934   if (isInvalidDecl())
1935     return false;
1936   
1937   switch (getTemplateSpecializationKind()) {
1938   case TSK_Undeclared:
1939   case TSK_ExplicitInstantiationDefinition:
1940     return false;
1941       
1942   case TSK_ImplicitInstantiation:
1943     return true;
1944
1945   // It is possible to instantiate TSK_ExplicitSpecialization kind
1946   // if the FunctionDecl has a class scope specialization pattern.
1947   case TSK_ExplicitSpecialization:
1948     return getClassScopeSpecializationPattern() != 0;
1949
1950   case TSK_ExplicitInstantiationDeclaration:
1951     // Handled below.
1952     break;
1953   }
1954
1955   // Find the actual template from which we will instantiate.
1956   const FunctionDecl *PatternDecl = getTemplateInstantiationPattern();
1957   bool HasPattern = false;
1958   if (PatternDecl)
1959     HasPattern = PatternDecl->hasBody(PatternDecl);
1960   
1961   // C++0x [temp.explicit]p9:
1962   //   Except for inline functions, other explicit instantiation declarations
1963   //   have the effect of suppressing the implicit instantiation of the entity
1964   //   to which they refer. 
1965   if (!HasPattern || !PatternDecl) 
1966     return true;
1967
1968   return PatternDecl->isInlined();
1969 }                      
1970    
1971 FunctionDecl *FunctionDecl::getTemplateInstantiationPattern() const {
1972   // Handle class scope explicit specialization special case.
1973   if (getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
1974     return getClassScopeSpecializationPattern();
1975
1976   if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
1977     while (Primary->getInstantiatedFromMemberTemplate()) {
1978       // If we have hit a point where the user provided a specialization of
1979       // this template, we're done looking.
1980       if (Primary->isMemberSpecialization())
1981         break;
1982       
1983       Primary = Primary->getInstantiatedFromMemberTemplate();
1984     }
1985     
1986     return Primary->getTemplatedDecl();
1987   } 
1988     
1989   return getInstantiatedFromMemberFunction();
1990 }
1991
1992 FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const {
1993   if (FunctionTemplateSpecializationInfo *Info
1994         = TemplateOrSpecialization
1995             .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
1996     return Info->Template.getPointer();
1997   }
1998   return 0;
1999 }
2000
2001 FunctionDecl *FunctionDecl::getClassScopeSpecializationPattern() const {
2002     return getASTContext().getClassScopeSpecializationPattern(this);
2003 }
2004
2005 const TemplateArgumentList *
2006 FunctionDecl::getTemplateSpecializationArgs() const {
2007   if (FunctionTemplateSpecializationInfo *Info
2008         = TemplateOrSpecialization
2009             .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
2010     return Info->TemplateArguments;
2011   }
2012   return 0;
2013 }
2014
2015 const ASTTemplateArgumentListInfo *
2016 FunctionDecl::getTemplateSpecializationArgsAsWritten() const {
2017   if (FunctionTemplateSpecializationInfo *Info
2018         = TemplateOrSpecialization
2019             .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
2020     return Info->TemplateArgumentsAsWritten;
2021   }
2022   return 0;
2023 }
2024
2025 void
2026 FunctionDecl::setFunctionTemplateSpecialization(ASTContext &C,
2027                                                 FunctionTemplateDecl *Template,
2028                                      const TemplateArgumentList *TemplateArgs,
2029                                                 void *InsertPos,
2030                                                 TemplateSpecializationKind TSK,
2031                         const TemplateArgumentListInfo *TemplateArgsAsWritten,
2032                                           SourceLocation PointOfInstantiation) {
2033   assert(TSK != TSK_Undeclared && 
2034          "Must specify the type of function template specialization");
2035   FunctionTemplateSpecializationInfo *Info
2036     = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>();
2037   if (!Info)
2038     Info = FunctionTemplateSpecializationInfo::Create(C, this, Template, TSK,
2039                                                       TemplateArgs,
2040                                                       TemplateArgsAsWritten,
2041                                                       PointOfInstantiation);
2042   TemplateOrSpecialization = Info;
2043
2044   // Insert this function template specialization into the set of known
2045   // function template specializations.
2046   if (InsertPos)
2047     Template->addSpecialization(Info, InsertPos);
2048   else {
2049     // Try to insert the new node. If there is an existing node, leave it, the
2050     // set will contain the canonical decls while
2051     // FunctionTemplateDecl::findSpecialization will return
2052     // the most recent redeclarations.
2053     FunctionTemplateSpecializationInfo *Existing
2054       = Template->getSpecializations().GetOrInsertNode(Info);
2055     (void)Existing;
2056     assert((!Existing || Existing->Function->isCanonicalDecl()) &&
2057            "Set is supposed to only contain canonical decls");
2058   }
2059 }
2060
2061 void
2062 FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context,
2063                                     const UnresolvedSetImpl &Templates,
2064                              const TemplateArgumentListInfo &TemplateArgs) {
2065   assert(TemplateOrSpecialization.isNull());
2066   size_t Size = sizeof(DependentFunctionTemplateSpecializationInfo);
2067   Size += Templates.size() * sizeof(FunctionTemplateDecl*);
2068   Size += TemplateArgs.size() * sizeof(TemplateArgumentLoc);
2069   void *Buffer = Context.Allocate(Size);
2070   DependentFunctionTemplateSpecializationInfo *Info =
2071     new (Buffer) DependentFunctionTemplateSpecializationInfo(Templates,
2072                                                              TemplateArgs);
2073   TemplateOrSpecialization = Info;
2074 }
2075
2076 DependentFunctionTemplateSpecializationInfo::
2077 DependentFunctionTemplateSpecializationInfo(const UnresolvedSetImpl &Ts,
2078                                       const TemplateArgumentListInfo &TArgs)
2079   : AngleLocs(TArgs.getLAngleLoc(), TArgs.getRAngleLoc()) {
2080
2081   d.NumTemplates = Ts.size();
2082   d.NumArgs = TArgs.size();
2083
2084   FunctionTemplateDecl **TsArray =
2085     const_cast<FunctionTemplateDecl**>(getTemplates());
2086   for (unsigned I = 0, E = Ts.size(); I != E; ++I)
2087     TsArray[I] = cast<FunctionTemplateDecl>(Ts[I]->getUnderlyingDecl());
2088
2089   TemplateArgumentLoc *ArgsArray =
2090     const_cast<TemplateArgumentLoc*>(getTemplateArgs());
2091   for (unsigned I = 0, E = TArgs.size(); I != E; ++I)
2092     new (&ArgsArray[I]) TemplateArgumentLoc(TArgs[I]);
2093 }
2094
2095 TemplateSpecializationKind FunctionDecl::getTemplateSpecializationKind() const {
2096   // For a function template specialization, query the specialization
2097   // information object.
2098   FunctionTemplateSpecializationInfo *FTSInfo
2099     = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>();
2100   if (FTSInfo)
2101     return FTSInfo->getTemplateSpecializationKind();
2102
2103   MemberSpecializationInfo *MSInfo
2104     = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>();
2105   if (MSInfo)
2106     return MSInfo->getTemplateSpecializationKind();
2107   
2108   return TSK_Undeclared;
2109 }
2110
2111 void
2112 FunctionDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
2113                                           SourceLocation PointOfInstantiation) {
2114   if (FunctionTemplateSpecializationInfo *FTSInfo
2115         = TemplateOrSpecialization.dyn_cast<
2116                                     FunctionTemplateSpecializationInfo*>()) {
2117     FTSInfo->setTemplateSpecializationKind(TSK);
2118     if (TSK != TSK_ExplicitSpecialization &&
2119         PointOfInstantiation.isValid() &&
2120         FTSInfo->getPointOfInstantiation().isInvalid())
2121       FTSInfo->setPointOfInstantiation(PointOfInstantiation);
2122   } else if (MemberSpecializationInfo *MSInfo
2123              = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>()) {
2124     MSInfo->setTemplateSpecializationKind(TSK);
2125     if (TSK != TSK_ExplicitSpecialization &&
2126         PointOfInstantiation.isValid() &&
2127         MSInfo->getPointOfInstantiation().isInvalid())
2128       MSInfo->setPointOfInstantiation(PointOfInstantiation);
2129   } else
2130     llvm_unreachable("Function cannot have a template specialization kind");
2131 }
2132
2133 SourceLocation FunctionDecl::getPointOfInstantiation() const {
2134   if (FunctionTemplateSpecializationInfo *FTSInfo
2135         = TemplateOrSpecialization.dyn_cast<
2136                                         FunctionTemplateSpecializationInfo*>())
2137     return FTSInfo->getPointOfInstantiation();
2138   else if (MemberSpecializationInfo *MSInfo
2139              = TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>())
2140     return MSInfo->getPointOfInstantiation();
2141   
2142   return SourceLocation();
2143 }
2144
2145 bool FunctionDecl::isOutOfLine() const {
2146   if (Decl::isOutOfLine())
2147     return true;
2148   
2149   // If this function was instantiated from a member function of a 
2150   // class template, check whether that member function was defined out-of-line.
2151   if (FunctionDecl *FD = getInstantiatedFromMemberFunction()) {
2152     const FunctionDecl *Definition;
2153     if (FD->hasBody(Definition))
2154       return Definition->isOutOfLine();
2155   }
2156   
2157   // If this function was instantiated from a function template,
2158   // check whether that function template was defined out-of-line.
2159   if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) {
2160     const FunctionDecl *Definition;
2161     if (FunTmpl->getTemplatedDecl()->hasBody(Definition))
2162       return Definition->isOutOfLine();
2163   }
2164   
2165   return false;
2166 }
2167
2168 SourceRange FunctionDecl::getSourceRange() const {
2169   return SourceRange(getOuterLocStart(), EndRangeLoc);
2170 }
2171
2172 //===----------------------------------------------------------------------===//
2173 // FieldDecl Implementation
2174 //===----------------------------------------------------------------------===//
2175
2176 FieldDecl *FieldDecl::Create(const ASTContext &C, DeclContext *DC,
2177                              SourceLocation StartLoc, SourceLocation IdLoc,
2178                              IdentifierInfo *Id, QualType T,
2179                              TypeSourceInfo *TInfo, Expr *BW, bool Mutable,
2180                              bool HasInit) {
2181   return new (C) FieldDecl(Decl::Field, DC, StartLoc, IdLoc, Id, T, TInfo,
2182                            BW, Mutable, HasInit);
2183 }
2184
2185 bool FieldDecl::isAnonymousStructOrUnion() const {
2186   if (!isImplicit() || getDeclName())
2187     return false;
2188
2189   if (const RecordType *Record = getType()->getAs<RecordType>())
2190     return Record->getDecl()->isAnonymousStructOrUnion();
2191
2192   return false;
2193 }
2194
2195 unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const {
2196   assert(isBitField() && "not a bitfield");
2197   Expr *BitWidth = InitializerOrBitWidth.getPointer();
2198   return BitWidth->EvaluateKnownConstInt(Ctx).getZExtValue();
2199 }
2200
2201 unsigned FieldDecl::getFieldIndex() const {
2202   if (CachedFieldIndex) return CachedFieldIndex - 1;
2203
2204   unsigned index = 0;
2205   const RecordDecl *RD = getParent();
2206   const FieldDecl *LastFD = 0;
2207   bool IsMsStruct = RD->hasAttr<MsStructAttr>();
2208   
2209   RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
2210   while (true) {
2211     assert(i != e && "failed to find field in parent!");
2212     if (*i == this)
2213       break;
2214
2215     if (IsMsStruct) {
2216       // Zero-length bitfields following non-bitfield members are ignored.
2217       if (getASTContext().ZeroBitfieldFollowsNonBitfield((*i), LastFD)) {
2218         ++i;
2219         continue;
2220       }
2221       LastFD = (*i);
2222     }
2223     ++i;
2224     ++index;
2225   }
2226
2227   CachedFieldIndex = index + 1;
2228   return index;
2229 }
2230
2231 SourceRange FieldDecl::getSourceRange() const {
2232   if (const Expr *E = InitializerOrBitWidth.getPointer())
2233     return SourceRange(getInnerLocStart(), E->getLocEnd());
2234   return DeclaratorDecl::getSourceRange();
2235 }
2236
2237 void FieldDecl::setInClassInitializer(Expr *Init) {
2238   assert(!InitializerOrBitWidth.getPointer() &&
2239          "bit width or initializer already set");
2240   InitializerOrBitWidth.setPointer(Init);
2241   InitializerOrBitWidth.setInt(0);
2242 }
2243
2244 //===----------------------------------------------------------------------===//
2245 // TagDecl Implementation
2246 //===----------------------------------------------------------------------===//
2247
2248 SourceLocation TagDecl::getOuterLocStart() const {
2249   return getTemplateOrInnerLocStart(this);
2250 }
2251
2252 SourceRange TagDecl::getSourceRange() const {
2253   SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
2254   return SourceRange(getOuterLocStart(), E);
2255 }
2256
2257 TagDecl* TagDecl::getCanonicalDecl() {
2258   return getFirstDeclaration();
2259 }
2260
2261 void TagDecl::setTypedefNameForAnonDecl(TypedefNameDecl *TDD) { 
2262   TypedefNameDeclOrQualifier = TDD; 
2263   if (TypeForDecl)
2264     const_cast<Type*>(TypeForDecl)->ClearLinkageCache();
2265   ClearLinkageCache();
2266 }
2267
2268 void TagDecl::startDefinition() {
2269   IsBeingDefined = true;
2270
2271   if (isa<CXXRecordDecl>(this)) {
2272     CXXRecordDecl *D = cast<CXXRecordDecl>(this);
2273     struct CXXRecordDecl::DefinitionData *Data = 
2274       new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
2275     for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I)
2276       cast<CXXRecordDecl>(*I)->DefinitionData = Data;
2277   }
2278 }
2279
2280 void TagDecl::completeDefinition() {
2281   assert((!isa<CXXRecordDecl>(this) ||
2282           cast<CXXRecordDecl>(this)->hasDefinition()) &&
2283          "definition completed but not started");
2284
2285   IsCompleteDefinition = true;
2286   IsBeingDefined = false;
2287
2288   if (ASTMutationListener *L = getASTMutationListener())
2289     L->CompletedTagDefinition(this);
2290 }
2291
2292 TagDecl *TagDecl::getDefinition() const {
2293   if (isCompleteDefinition())
2294     return const_cast<TagDecl *>(this);
2295   if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(this))
2296     return CXXRD->getDefinition();
2297
2298   for (redecl_iterator R = redecls_begin(), REnd = redecls_end();
2299        R != REnd; ++R)
2300     if (R->isCompleteDefinition())
2301       return *R;
2302
2303   return 0;
2304 }
2305
2306 void TagDecl::setQualifierInfo(NestedNameSpecifierLoc QualifierLoc) {
2307   if (QualifierLoc) {
2308     // Make sure the extended qualifier info is allocated.
2309     if (!hasExtInfo())
2310       TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
2311     // Set qualifier info.
2312     getExtInfo()->QualifierLoc = QualifierLoc;
2313   } else {
2314     // Here Qualifier == 0, i.e., we are removing the qualifier (if any).
2315     if (hasExtInfo()) {
2316       if (getExtInfo()->NumTemplParamLists == 0) {
2317         getASTContext().Deallocate(getExtInfo());
2318         TypedefNameDeclOrQualifier = (TypedefNameDecl*) 0;
2319       }
2320       else
2321         getExtInfo()->QualifierLoc = QualifierLoc;
2322     }
2323   }
2324 }
2325
2326 void TagDecl::setTemplateParameterListsInfo(ASTContext &Context,
2327                                             unsigned NumTPLists,
2328                                             TemplateParameterList **TPLists) {
2329   assert(NumTPLists > 0);
2330   // Make sure the extended decl info is allocated.
2331   if (!hasExtInfo())
2332     // Allocate external info struct.
2333     TypedefNameDeclOrQualifier = new (getASTContext()) ExtInfo;
2334   // Set the template parameter lists info.
2335   getExtInfo()->setTemplateParameterListsInfo(Context, NumTPLists, TPLists);
2336 }
2337
2338 //===----------------------------------------------------------------------===//
2339 // EnumDecl Implementation
2340 //===----------------------------------------------------------------------===//
2341
2342 EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC,
2343                            SourceLocation StartLoc, SourceLocation IdLoc,
2344                            IdentifierInfo *Id,
2345                            EnumDecl *PrevDecl, bool IsScoped,
2346                            bool IsScopedUsingClassTag, bool IsFixed) {
2347   EnumDecl *Enum = new (C) EnumDecl(DC, StartLoc, IdLoc, Id, PrevDecl,
2348                                     IsScoped, IsScopedUsingClassTag, IsFixed);
2349   C.getTypeDeclType(Enum, PrevDecl);
2350   return Enum;
2351 }
2352
2353 EnumDecl *EnumDecl::Create(ASTContext &C, EmptyShell Empty) {
2354   return new (C) EnumDecl(0, SourceLocation(), SourceLocation(), 0, 0,
2355                           false, false, false);
2356 }
2357
2358 void EnumDecl::completeDefinition(QualType NewType,
2359                                   QualType NewPromotionType,
2360                                   unsigned NumPositiveBits,
2361                                   unsigned NumNegativeBits) {
2362   assert(!isCompleteDefinition() && "Cannot redefine enums!");
2363   if (!IntegerType)
2364     IntegerType = NewType.getTypePtr();
2365   PromotionType = NewPromotionType;
2366   setNumPositiveBits(NumPositiveBits);
2367   setNumNegativeBits(NumNegativeBits);
2368   TagDecl::completeDefinition();
2369 }
2370
2371 //===----------------------------------------------------------------------===//
2372 // RecordDecl Implementation
2373 //===----------------------------------------------------------------------===//
2374
2375 RecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC,
2376                        SourceLocation StartLoc, SourceLocation IdLoc,
2377                        IdentifierInfo *Id, RecordDecl *PrevDecl)
2378   : TagDecl(DK, TK, DC, IdLoc, Id, PrevDecl, StartLoc) {
2379   HasFlexibleArrayMember = false;
2380   AnonymousStructOrUnion = false;
2381   HasObjectMember = false;
2382   LoadedFieldsFromExternalStorage = false;
2383   assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
2384 }
2385
2386 RecordDecl *RecordDecl::Create(const ASTContext &C, TagKind TK, DeclContext *DC,
2387                                SourceLocation StartLoc, SourceLocation IdLoc,
2388                                IdentifierInfo *Id, RecordDecl* PrevDecl) {
2389   RecordDecl* R = new (C) RecordDecl(Record, TK, DC, StartLoc, IdLoc, Id,
2390                                      PrevDecl);
2391   C.getTypeDeclType(R, PrevDecl);
2392   return R;
2393 }
2394
2395 RecordDecl *RecordDecl::Create(const ASTContext &C, EmptyShell Empty) {
2396   return new (C) RecordDecl(Record, TTK_Struct, 0, SourceLocation(),
2397                             SourceLocation(), 0, 0);
2398 }
2399
2400 bool RecordDecl::isInjectedClassName() const {
2401   return isImplicit() && getDeclName() && getDeclContext()->isRecord() &&
2402     cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName();
2403 }
2404
2405 RecordDecl::field_iterator RecordDecl::field_begin() const {
2406   if (hasExternalLexicalStorage() && !LoadedFieldsFromExternalStorage)
2407     LoadFieldsFromExternalStorage();
2408
2409   return field_iterator(decl_iterator(FirstDecl));
2410 }
2411
2412 /// completeDefinition - Notes that the definition of this type is now
2413 /// complete.
2414 void RecordDecl::completeDefinition() {
2415   assert(!isCompleteDefinition() && "Cannot redefine record!");
2416   TagDecl::completeDefinition();
2417 }
2418
2419 void RecordDecl::LoadFieldsFromExternalStorage() const {
2420   ExternalASTSource *Source = getASTContext().getExternalSource();
2421   assert(hasExternalLexicalStorage() && Source && "No external storage?");
2422
2423   // Notify that we have a RecordDecl doing some initialization.
2424   ExternalASTSource::Deserializing TheFields(Source);
2425
2426   SmallVector<Decl*, 64> Decls;
2427   LoadedFieldsFromExternalStorage = true;  
2428   switch (Source->FindExternalLexicalDeclsBy<FieldDecl>(this, Decls)) {
2429   case ELR_Success:
2430     break;
2431     
2432   case ELR_AlreadyLoaded:
2433   case ELR_Failure:
2434     return;
2435   }
2436
2437 #ifndef NDEBUG
2438   // Check that all decls we got were FieldDecls.
2439   for (unsigned i=0, e=Decls.size(); i != e; ++i)
2440     assert(isa<FieldDecl>(Decls[i]));
2441 #endif
2442
2443   if (Decls.empty())
2444     return;
2445
2446   llvm::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls,
2447                                                  /*FieldsAlreadyLoaded=*/false);
2448 }
2449
2450 //===----------------------------------------------------------------------===//
2451 // BlockDecl Implementation
2452 //===----------------------------------------------------------------------===//
2453
2454 void BlockDecl::setParams(llvm::ArrayRef<ParmVarDecl *> NewParamInfo) {
2455   assert(ParamInfo == 0 && "Already has param info!");
2456
2457   // Zero params -> null pointer.
2458   if (!NewParamInfo.empty()) {
2459     NumParams = NewParamInfo.size();
2460     ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
2461     std::copy(NewParamInfo.begin(), NewParamInfo.end(), ParamInfo);
2462   }
2463 }
2464
2465 void BlockDecl::setCaptures(ASTContext &Context,
2466                             const Capture *begin,
2467                             const Capture *end,
2468                             bool capturesCXXThis) {
2469   CapturesCXXThis = capturesCXXThis;
2470
2471   if (begin == end) {
2472     NumCaptures = 0;
2473     Captures = 0;
2474     return;
2475   }
2476
2477   NumCaptures = end - begin;
2478
2479   // Avoid new Capture[] because we don't want to provide a default
2480   // constructor.
2481   size_t allocationSize = NumCaptures * sizeof(Capture);
2482   void *buffer = Context.Allocate(allocationSize, /*alignment*/sizeof(void*));
2483   memcpy(buffer, begin, allocationSize);
2484   Captures = static_cast<Capture*>(buffer);
2485 }
2486
2487 bool BlockDecl::capturesVariable(const VarDecl *variable) const {
2488   for (capture_const_iterator
2489          i = capture_begin(), e = capture_end(); i != e; ++i)
2490     // Only auto vars can be captured, so no redeclaration worries.
2491     if (i->getVariable() == variable)
2492       return true;
2493
2494   return false;
2495 }
2496
2497 SourceRange BlockDecl::getSourceRange() const {
2498   return SourceRange(getLocation(), Body? Body->getLocEnd() : getLocation());
2499 }
2500
2501 //===----------------------------------------------------------------------===//
2502 // Other Decl Allocation/Deallocation Method Implementations
2503 //===----------------------------------------------------------------------===//
2504
2505 TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
2506   return new (C) TranslationUnitDecl(C);
2507 }
2508
2509 LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC,
2510                              SourceLocation IdentL, IdentifierInfo *II) {
2511   return new (C) LabelDecl(DC, IdentL, II, 0, IdentL);
2512 }
2513
2514 LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC,
2515                              SourceLocation IdentL, IdentifierInfo *II,
2516                              SourceLocation GnuLabelL) {
2517   assert(GnuLabelL != IdentL && "Use this only for GNU local labels");
2518   return new (C) LabelDecl(DC, IdentL, II, 0, GnuLabelL);
2519 }
2520
2521
2522 NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
2523                                      SourceLocation StartLoc,
2524                                      SourceLocation IdLoc, IdentifierInfo *Id) {
2525   return new (C) NamespaceDecl(DC, StartLoc, IdLoc, Id);
2526 }
2527
2528 NamespaceDecl *NamespaceDecl::getNextNamespace() {
2529   return dyn_cast_or_null<NamespaceDecl>(
2530                        NextNamespace.get(getASTContext().getExternalSource()));
2531 }
2532
2533 ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
2534                                              SourceLocation IdLoc,
2535                                              IdentifierInfo *Id,
2536                                              QualType Type) {
2537   return new (C) ImplicitParamDecl(DC, IdLoc, Id, Type);
2538 }
2539
2540 FunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
2541                                    SourceLocation StartLoc,
2542                                    const DeclarationNameInfo &NameInfo,
2543                                    QualType T, TypeSourceInfo *TInfo,
2544                                    StorageClass SC, StorageClass SCAsWritten,
2545                                    bool isInlineSpecified, 
2546                                    bool hasWrittenPrototype,
2547                                    bool isConstexprSpecified) {
2548   FunctionDecl *New = new (C) FunctionDecl(Function, DC, StartLoc, NameInfo,
2549                                            T, TInfo, SC, SCAsWritten,
2550                                            isInlineSpecified,
2551                                            isConstexprSpecified);
2552   New->HasWrittenPrototype = hasWrittenPrototype;
2553   return New;
2554 }
2555
2556 BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {
2557   return new (C) BlockDecl(DC, L);
2558 }
2559
2560 EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
2561                                            SourceLocation L,
2562                                            IdentifierInfo *Id, QualType T,
2563                                            Expr *E, const llvm::APSInt &V) {
2564   return new (C) EnumConstantDecl(CD, L, Id, T, E, V);
2565 }
2566
2567 IndirectFieldDecl *
2568 IndirectFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
2569                           IdentifierInfo *Id, QualType T, NamedDecl **CH,
2570                           unsigned CHS) {
2571   return new (C) IndirectFieldDecl(DC, L, Id, T, CH, CHS);
2572 }
2573
2574 SourceRange EnumConstantDecl::getSourceRange() const {
2575   SourceLocation End = getLocation();
2576   if (Init)
2577     End = Init->getLocEnd();
2578   return SourceRange(getLocation(), End);
2579 }
2580
2581 TypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
2582                                  SourceLocation StartLoc, SourceLocation IdLoc,
2583                                  IdentifierInfo *Id, TypeSourceInfo *TInfo) {
2584   return new (C) TypedefDecl(DC, StartLoc, IdLoc, Id, TInfo);
2585 }
2586
2587 TypeAliasDecl *TypeAliasDecl::Create(ASTContext &C, DeclContext *DC,
2588                                      SourceLocation StartLoc,
2589                                      SourceLocation IdLoc, IdentifierInfo *Id,
2590                                      TypeSourceInfo *TInfo) {
2591   return new (C) TypeAliasDecl(DC, StartLoc, IdLoc, Id, TInfo);
2592 }
2593
2594 SourceRange TypedefDecl::getSourceRange() const {
2595   SourceLocation RangeEnd = getLocation();
2596   if (TypeSourceInfo *TInfo = getTypeSourceInfo()) {
2597     if (typeIsPostfix(TInfo->getType()))
2598       RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
2599   }
2600   return SourceRange(getLocStart(), RangeEnd);
2601 }
2602
2603 SourceRange TypeAliasDecl::getSourceRange() const {
2604   SourceLocation RangeEnd = getLocStart();
2605   if (TypeSourceInfo *TInfo = getTypeSourceInfo())
2606     RangeEnd = TInfo->getTypeLoc().getSourceRange().getEnd();
2607   return SourceRange(getLocStart(), RangeEnd);
2608 }
2609
2610 FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC,
2611                                            StringLiteral *Str,
2612                                            SourceLocation AsmLoc,
2613                                            SourceLocation RParenLoc) {
2614   return new (C) FileScopeAsmDecl(DC, Str, AsmLoc, RParenLoc);
2615 }