Decl.cpp revision 8a1d6a5eec8287729084e2a79b39fac96a9c75cd
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
33using namespace clang;
34
35//===----------------------------------------------------------------------===//
36// NamedDecl Implementation
37//===----------------------------------------------------------------------===//
38
39static 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
68typedef NamedDecl::LinkageInfo LinkageInfo;
69typedef std::pair<Linkage,Visibility> LVPair;
70
71static LVPair merge(LVPair L, LVPair R) {
72  return LVPair(minLinkage(L.first, R.first),
73                minVisibility(L.second, R.second));
74}
75
76static LVPair merge(LVPair L, LinkageInfo R) {
77  return LVPair(minLinkage(L.first, R.linkage()),
78                minVisibility(L.second, R.visibility()));
79}
80
81namespace {
82/// Flags controlling the computation of linkage and visibility.
83struct 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.
117static LVPair
118getLVForTemplateParameterList(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.
149static 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.
153static 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
196static LVPair
197getLVForTemplateArgumentList(const TemplateArgumentList &TArgs,
198                             LVFlags &F) {
199  return getLVForTemplateArgumentList(TArgs.data(), TArgs.size(), F);
200}
201
202static bool shouldConsiderTemplateLV(const FunctionDecl *fn,
203                               const FunctionTemplateSpecializationInfo *spec) {
204  return !(spec->isExplicitSpecialization() &&
205           fn->hasAttr<VisibilityAttr>());
206}
207
208static bool shouldConsiderTemplateLV(const ClassTemplateSpecializationDecl *d) {
209  return !(d->isExplicitSpecialization() && d->hasAttr<VisibilityAttr>());
210}
211
212static 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
497static 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
617static 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
626void 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
662Linkage 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
675LinkageInfo 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
683llvm::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
718static 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
813std::string NamedDecl::getQualifiedNameAsString() const {
814  return getQualifiedNameAsString(getASTContext().getLangOptions());
815}
816
817std::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
893bool 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
942bool NamedDecl::hasLinkage() const {
943  return getLinkage() != NoLinkage;
944}
945
946NamedDecl *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
959bool 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
981template <typename DeclT>
982static SourceLocation getTemplateOrInnerLocStart(const DeclT *decl) {
983  if (decl->getNumTemplateParameterLists() > 0)
984    return decl->getTemplateParameterList(0)->getTemplateLoc();
985  else
986    return decl->getInnerLocStart();
987}
988
989SourceLocation DeclaratorDecl::getTypeSpecStartLoc() const {
990  TypeSourceInfo *TSI = getTypeSourceInfo();
991  if (TSI) return TSI->getTypeLoc().getBeginLoc();
992  return SourceLocation();
993}
994
995void 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
1025void
1026DeclaratorDecl::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
1043SourceLocation DeclaratorDecl::getOuterLocStart() const {
1044  return getTemplateOrInnerLocStart(this);
1045}
1046
1047namespace {
1048
1049// Helper function: returns true if QT is or contains a type
1050// having a postfix component.
1051bool 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
1087SourceRange 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
1096void
1097QualifierInfo::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
1122const 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
1137VarDecl *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
1144void VarDecl::setStorageClass(StorageClass SC) {
1145  assert(isLegalForVariable(SC));
1146  if (getStorageClass() != SC)
1147    ClearLinkageCache();
1148
1149  VarDeclBits.SClass = SC;
1150}
1151
1152SourceRange VarDecl::getSourceRange() const {
1153  if (getInit())
1154    return SourceRange(getOuterLocStart(), getInit()->getLocEnd());
1155  return DeclaratorDecl::getSourceRange();
1156}
1157
1158bool 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
1182VarDecl *VarDecl::getCanonicalDecl() {
1183  return getFirstDeclaration();
1184}
1185
1186VarDecl::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
1236VarDecl *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
1254bool 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
1266VarDecl *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
1276VarDecl::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
1287const 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
1299bool 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
1315VarDecl *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
1328void 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
1337bool 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
1350VarDecl *VarDecl::getInstantiatedFromStaticDataMember() const {
1351  if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
1352    return cast<VarDecl>(MSI->getInstantiatedFrom());
1353
1354  return 0;
1355}
1356
1357TemplateSpecializationKind VarDecl::getTemplateSpecializationKind() const {
1358  if (MemberSpecializationInfo *MSI = getMemberSpecializationInfo())
1359    return MSI->getTemplateSpecializationKind();
1360
1361  return TSK_Undeclared;
1362}
1363
1364MemberSpecializationInfo *VarDecl::getMemberSpecializationInfo() const {
1365  return getASTContext().getInstantiatedFromStaticDataMember(this);
1366}
1367
1368void 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
1383ParmVarDecl *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
1393SourceRange 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
1403Expr *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
1415unsigned ParmVarDecl::getNumDefaultArgTemporaries() const {
1416  if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(getInit()))
1417    return E->getNumTemporaries();
1418
1419  return 0;
1420}
1421
1422CXXTemporary *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
1430SourceRange 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
1440bool ParmVarDecl::isParameterPack() const {
1441  return isa<PackExpansionType>(getType());
1442}
1443
1444void ParmVarDecl::setParameterIndexLarge(unsigned parameterIndex) {
1445  getASTContext().setParameterIndex(this, parameterIndex);
1446  ParmVarDeclBits.ParameterIndex = ParameterIndexSentinel;
1447}
1448
1449unsigned ParmVarDecl::getParameterIndexLarge() const {
1450  return getASTContext().getParameterIndex(this);
1451}
1452
1453//===----------------------------------------------------------------------===//
1454// FunctionDecl Implementation
1455//===----------------------------------------------------------------------===//
1456
1457void 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
1470bool FunctionDecl::isVariadic() const {
1471  if (const FunctionProtoType *FT = getType()->getAs<FunctionProtoType>())
1472    return FT->isVariadic();
1473  return false;
1474}
1475
1476bool 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
1487bool 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
1501bool 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
1512Stmt *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
1526void FunctionDecl::setBody(Stmt *B) {
1527  Body = B;
1528  if (B)
1529    EndRangeLoc = B->getLocEnd();
1530}
1531
1532void FunctionDecl::setPure(bool P) {
1533  IsPure = P;
1534  if (P)
1535    if (CXXRecordDecl *Parent = dyn_cast<CXXRecordDecl>(getDeclContext()))
1536      Parent->markedVirtualFunctionPure();
1537}
1538
1539bool 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
1548bool 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
1570bool 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
1594bool 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
1614void
1615FunctionDecl::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
1629const FunctionDecl *FunctionDecl::getCanonicalDecl() const {
1630  return getFirstDeclaration();
1631}
1632
1633FunctionDecl *FunctionDecl::getCanonicalDecl() {
1634  return getFirstDeclaration();
1635}
1636
1637void 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.
1654unsigned 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.
1693unsigned 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
1701void 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.
1717unsigned 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
1748bool 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.
1786bool 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.
1824bool 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.
1878OverloadedOperatorKind 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.
1887const IdentifierInfo *FunctionDecl::getLiteralIdentifier() const {
1888  if (getDeclName().getNameKind() == DeclarationName::CXXLiteralOperatorName)
1889    return getDeclName().getCXXLiteralIdentifier();
1890  else
1891    return 0;
1892}
1893
1894FunctionDecl::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
1910FunctionDecl *FunctionDecl::getInstantiatedFromMemberFunction() const {
1911  if (MemberSpecializationInfo *Info = getMemberSpecializationInfo())
1912    return cast<FunctionDecl>(Info->getInstantiatedFrom());
1913
1914  return 0;
1915}
1916
1917MemberSpecializationInfo *FunctionDecl::getMemberSpecializationInfo() const {
1918  return TemplateOrSpecialization.dyn_cast<MemberSpecializationInfo*>();
1919}
1920
1921void
1922FunctionDecl::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
1932bool 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
1971FunctionDecl *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
1992FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const {
1993  if (FunctionTemplateSpecializationInfo *Info
1994        = TemplateOrSpecialization
1995            .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
1996    return Info->Template.getPointer();
1997  }
1998  return 0;
1999}
2000
2001FunctionDecl *FunctionDecl::getClassScopeSpecializationPattern() const {
2002    return getASTContext().getClassScopeSpecializationPattern(this);
2003}
2004
2005const TemplateArgumentList *
2006FunctionDecl::getTemplateSpecializationArgs() const {
2007  if (FunctionTemplateSpecializationInfo *Info
2008        = TemplateOrSpecialization
2009            .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
2010    return Info->TemplateArguments;
2011  }
2012  return 0;
2013}
2014
2015const ASTTemplateArgumentListInfo *
2016FunctionDecl::getTemplateSpecializationArgsAsWritten() const {
2017  if (FunctionTemplateSpecializationInfo *Info
2018        = TemplateOrSpecialization
2019            .dyn_cast<FunctionTemplateSpecializationInfo*>()) {
2020    return Info->TemplateArgumentsAsWritten;
2021  }
2022  return 0;
2023}
2024
2025void
2026FunctionDecl::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
2061void
2062FunctionDecl::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
2076DependentFunctionTemplateSpecializationInfo::
2077DependentFunctionTemplateSpecializationInfo(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
2095TemplateSpecializationKind 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
2111void
2112FunctionDecl::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
2133SourceLocation 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
2145bool 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
2168SourceRange FunctionDecl::getSourceRange() const {
2169  return SourceRange(getOuterLocStart(), EndRangeLoc);
2170}
2171
2172//===----------------------------------------------------------------------===//
2173// FieldDecl Implementation
2174//===----------------------------------------------------------------------===//
2175
2176FieldDecl *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
2185bool 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
2195unsigned 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
2201unsigned 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
2231SourceRange FieldDecl::getSourceRange() const {
2232  if (const Expr *E = InitializerOrBitWidth.getPointer())
2233    return SourceRange(getInnerLocStart(), E->getLocEnd());
2234  return DeclaratorDecl::getSourceRange();
2235}
2236
2237void 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
2248SourceLocation TagDecl::getOuterLocStart() const {
2249  return getTemplateOrInnerLocStart(this);
2250}
2251
2252SourceRange TagDecl::getSourceRange() const {
2253  SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation();
2254  return SourceRange(getOuterLocStart(), E);
2255}
2256
2257TagDecl* TagDecl::getCanonicalDecl() {
2258  return getFirstDeclaration();
2259}
2260
2261void TagDecl::setTypedefNameForAnonDecl(TypedefNameDecl *TDD) {
2262  TypedefNameDeclOrQualifier = TDD;
2263  if (TypeForDecl)
2264    const_cast<Type*>(TypeForDecl)->ClearLinkageCache();
2265  ClearLinkageCache();
2266}
2267
2268void 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
2280void 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
2292TagDecl *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
2306void 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
2326void 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
2342EnumDecl *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
2353EnumDecl *EnumDecl::Create(ASTContext &C, EmptyShell Empty) {
2354  return new (C) EnumDecl(0, SourceLocation(), SourceLocation(), 0, 0,
2355                          false, false, false);
2356}
2357
2358void 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
2375RecordDecl::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
2386RecordDecl *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
2395RecordDecl *RecordDecl::Create(const ASTContext &C, EmptyShell Empty) {
2396  return new (C) RecordDecl(Record, TTK_Struct, 0, SourceLocation(),
2397                            SourceLocation(), 0, 0);
2398}
2399
2400bool RecordDecl::isInjectedClassName() const {
2401  return isImplicit() && getDeclName() && getDeclContext()->isRecord() &&
2402    cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName();
2403}
2404
2405RecordDecl::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.
2414void RecordDecl::completeDefinition() {
2415  assert(!isCompleteDefinition() && "Cannot redefine record!");
2416  TagDecl::completeDefinition();
2417}
2418
2419void 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
2454void 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
2465void 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
2487bool 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
2497SourceRange BlockDecl::getSourceRange() const {
2498  return SourceRange(getLocation(), Body? Body->getLocEnd() : getLocation());
2499}
2500
2501//===----------------------------------------------------------------------===//
2502// Other Decl Allocation/Deallocation Method Implementations
2503//===----------------------------------------------------------------------===//
2504
2505TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
2506  return new (C) TranslationUnitDecl(C);
2507}
2508
2509LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC,
2510                             SourceLocation IdentL, IdentifierInfo *II) {
2511  return new (C) LabelDecl(DC, IdentL, II, 0, IdentL);
2512}
2513
2514LabelDecl *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
2522NamespaceDecl *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
2528NamespaceDecl *NamespaceDecl::getNextNamespace() {
2529  return dyn_cast_or_null<NamespaceDecl>(
2530                       NextNamespace.get(getASTContext().getExternalSource()));
2531}
2532
2533ImplicitParamDecl *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
2540FunctionDecl *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
2556BlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {
2557  return new (C) BlockDecl(DC, L);
2558}
2559
2560EnumConstantDecl *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
2567IndirectFieldDecl *
2568IndirectFieldDecl::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
2574SourceRange EnumConstantDecl::getSourceRange() const {
2575  SourceLocation End = getLocation();
2576  if (Init)
2577    End = Init->getLocEnd();
2578  return SourceRange(getLocation(), End);
2579}
2580
2581TypedefDecl *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
2587TypeAliasDecl *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
2594SourceRange 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
2603SourceRange 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
2610FileScopeAsmDecl *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}
2616