SemaTemplateInstantiate.cpp revision 841324a33cb8dd0868bd3102f5ba0b4f10dddf0f
1//===------- SemaTemplateInstantiate.cpp - C++ Template Instantiation ------===/
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//  This file implements C++ template instantiation.
10//
11//===----------------------------------------------------------------------===/
12
13#include "Sema.h"
14#include "TreeTransform.h"
15#include "clang/AST/ASTConsumer.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/AST/Expr.h"
18#include "clang/AST/DeclTemplate.h"
19#include "clang/Parse/DeclSpec.h"
20#include "clang/Basic/LangOptions.h"
21#include "llvm/Support/Compiler.h"
22
23using namespace clang;
24
25//===----------------------------------------------------------------------===/
26// Template Instantiation Support
27//===----------------------------------------------------------------------===/
28
29/// \brief Retrieve the template argument list that should be used to
30/// instantiate the given declaration.
31const TemplateArgumentList &
32Sema::getTemplateInstantiationArgs(NamedDecl *D) {
33  // Template arguments for a class template specialization.
34  if (ClassTemplateSpecializationDecl *Spec
35        = dyn_cast<ClassTemplateSpecializationDecl>(D))
36    return Spec->getTemplateInstantiationArgs();
37
38  // Template arguments for a function template specialization.
39  if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D))
40    if (const TemplateArgumentList *TemplateArgs
41          = Function->getTemplateSpecializationArgs())
42      return *TemplateArgs;
43
44  // Template arguments for a member of a class template specialization.
45  DeclContext *EnclosingTemplateCtx = D->getDeclContext();
46  while (!isa<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx)) {
47    assert(!EnclosingTemplateCtx->isFileContext() &&
48           "Tried to get the instantiation arguments of a non-template");
49    EnclosingTemplateCtx = EnclosingTemplateCtx->getParent();
50  }
51
52  ClassTemplateSpecializationDecl *EnclosingTemplate
53    = cast<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx);
54  return EnclosingTemplate->getTemplateInstantiationArgs();
55}
56
57Sema::InstantiatingTemplate::
58InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
59                      Decl *Entity,
60                      SourceRange InstantiationRange)
61  :  SemaRef(SemaRef) {
62
63  Invalid = CheckInstantiationDepth(PointOfInstantiation,
64                                    InstantiationRange);
65  if (!Invalid) {
66    ActiveTemplateInstantiation Inst;
67    Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation;
68    Inst.PointOfInstantiation = PointOfInstantiation;
69    Inst.Entity = reinterpret_cast<uintptr_t>(Entity);
70    Inst.TemplateArgs = 0;
71    Inst.NumTemplateArgs = 0;
72    Inst.InstantiationRange = InstantiationRange;
73    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
74    Invalid = false;
75  }
76}
77
78Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
79                                         SourceLocation PointOfInstantiation,
80                                         TemplateDecl *Template,
81                                         const TemplateArgument *TemplateArgs,
82                                         unsigned NumTemplateArgs,
83                                         SourceRange InstantiationRange)
84  : SemaRef(SemaRef) {
85
86  Invalid = CheckInstantiationDepth(PointOfInstantiation,
87                                    InstantiationRange);
88  if (!Invalid) {
89    ActiveTemplateInstantiation Inst;
90    Inst.Kind
91      = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation;
92    Inst.PointOfInstantiation = PointOfInstantiation;
93    Inst.Entity = reinterpret_cast<uintptr_t>(Template);
94    Inst.TemplateArgs = TemplateArgs;
95    Inst.NumTemplateArgs = NumTemplateArgs;
96    Inst.InstantiationRange = InstantiationRange;
97    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
98    Invalid = false;
99  }
100}
101
102Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
103                                         SourceLocation PointOfInstantiation,
104                                      FunctionTemplateDecl *FunctionTemplate,
105                                        const TemplateArgument *TemplateArgs,
106                                                   unsigned NumTemplateArgs,
107                         ActiveTemplateInstantiation::InstantiationKind Kind,
108                                              SourceRange InstantiationRange)
109: SemaRef(SemaRef) {
110
111  Invalid = CheckInstantiationDepth(PointOfInstantiation,
112                                    InstantiationRange);
113  if (!Invalid) {
114    ActiveTemplateInstantiation Inst;
115    Inst.Kind = Kind;
116    Inst.PointOfInstantiation = PointOfInstantiation;
117    Inst.Entity = reinterpret_cast<uintptr_t>(FunctionTemplate);
118    Inst.TemplateArgs = TemplateArgs;
119    Inst.NumTemplateArgs = NumTemplateArgs;
120    Inst.InstantiationRange = InstantiationRange;
121    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
122    Invalid = false;
123  }
124}
125
126Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
127                                         SourceLocation PointOfInstantiation,
128                          ClassTemplatePartialSpecializationDecl *PartialSpec,
129                                         const TemplateArgument *TemplateArgs,
130                                         unsigned NumTemplateArgs,
131                                         SourceRange InstantiationRange)
132  : SemaRef(SemaRef) {
133
134  Invalid = CheckInstantiationDepth(PointOfInstantiation,
135                                    InstantiationRange);
136  if (!Invalid) {
137    ActiveTemplateInstantiation Inst;
138    Inst.Kind
139      = ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution;
140    Inst.PointOfInstantiation = PointOfInstantiation;
141    Inst.Entity = reinterpret_cast<uintptr_t>(PartialSpec);
142    Inst.TemplateArgs = TemplateArgs;
143    Inst.NumTemplateArgs = NumTemplateArgs;
144    Inst.InstantiationRange = InstantiationRange;
145    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
146    Invalid = false;
147  }
148}
149
150void Sema::InstantiatingTemplate::Clear() {
151  if (!Invalid) {
152    SemaRef.ActiveTemplateInstantiations.pop_back();
153    Invalid = true;
154  }
155}
156
157bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
158                                        SourceLocation PointOfInstantiation,
159                                           SourceRange InstantiationRange) {
160  if (SemaRef.ActiveTemplateInstantiations.size()
161       <= SemaRef.getLangOptions().InstantiationDepth)
162    return false;
163
164  SemaRef.Diag(PointOfInstantiation,
165               diag::err_template_recursion_depth_exceeded)
166    << SemaRef.getLangOptions().InstantiationDepth
167    << InstantiationRange;
168  SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
169    << SemaRef.getLangOptions().InstantiationDepth;
170  return true;
171}
172
173/// \brief Prints the current instantiation stack through a series of
174/// notes.
175void Sema::PrintInstantiationStack() {
176  // FIXME: In all of these cases, we need to show the template arguments
177  for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
178         Active = ActiveTemplateInstantiations.rbegin(),
179         ActiveEnd = ActiveTemplateInstantiations.rend();
180       Active != ActiveEnd;
181       ++Active) {
182    switch (Active->Kind) {
183    case ActiveTemplateInstantiation::TemplateInstantiation: {
184      Decl *D = reinterpret_cast<Decl *>(Active->Entity);
185      if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
186        unsigned DiagID = diag::note_template_member_class_here;
187        if (isa<ClassTemplateSpecializationDecl>(Record))
188          DiagID = diag::note_template_class_instantiation_here;
189        Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
190                     DiagID)
191          << Context.getTypeDeclType(Record)
192          << Active->InstantiationRange;
193      } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
194        unsigned DiagID;
195        if (Function->getPrimaryTemplate())
196          DiagID = diag::note_function_template_spec_here;
197        else
198          DiagID = diag::note_template_member_function_here;
199        Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
200                     DiagID)
201          << Function
202          << Active->InstantiationRange;
203      } else {
204        Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
205                     diag::note_template_static_data_member_def_here)
206          << cast<VarDecl>(D)
207          << Active->InstantiationRange;
208      }
209      break;
210    }
211
212    case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
213      TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity);
214      std::string TemplateArgsStr
215        = TemplateSpecializationType::PrintTemplateArgumentList(
216                                                         Active->TemplateArgs,
217                                                      Active->NumTemplateArgs,
218                                                      Context.PrintingPolicy);
219      Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
220                   diag::note_default_arg_instantiation_here)
221        << (Template->getNameAsString() + TemplateArgsStr)
222        << Active->InstantiationRange;
223      break;
224    }
225
226    case ActiveTemplateInstantiation::ExplicitTemplateArgumentSubstitution: {
227      FunctionTemplateDecl *FnTmpl
228        = cast<FunctionTemplateDecl>((Decl *)Active->Entity);
229      Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
230                   diag::note_explicit_template_arg_substitution_here)
231        << FnTmpl << Active->InstantiationRange;
232      break;
233    }
234
235    case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution:
236      if (ClassTemplatePartialSpecializationDecl *PartialSpec
237            = dyn_cast<ClassTemplatePartialSpecializationDecl>(
238                                                    (Decl *)Active->Entity)) {
239        Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
240                     diag::note_partial_spec_deduct_instantiation_here)
241          << Context.getTypeDeclType(PartialSpec)
242          << Active->InstantiationRange;
243      } else {
244        FunctionTemplateDecl *FnTmpl
245          = cast<FunctionTemplateDecl>((Decl *)Active->Entity);
246        Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
247                     diag::note_function_template_deduction_instantiation_here)
248          << FnTmpl << Active->InstantiationRange;
249      }
250      break;
251
252    }
253  }
254}
255
256bool Sema::isSFINAEContext() const {
257  using llvm::SmallVector;
258  for (SmallVector<ActiveTemplateInstantiation, 16>::const_reverse_iterator
259         Active = ActiveTemplateInstantiations.rbegin(),
260         ActiveEnd = ActiveTemplateInstantiations.rend();
261       Active != ActiveEnd;
262       ++Active) {
263
264    switch(Active->Kind) {
265    case ActiveTemplateInstantiation::TemplateInstantiation:
266      // This is a template instantiation, so there is no SFINAE.
267      return false;
268
269    case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation:
270      // A default template argument instantiation may or may not be a
271      // SFINAE context; look further up the stack.
272      break;
273
274    case ActiveTemplateInstantiation::ExplicitTemplateArgumentSubstitution:
275    case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution:
276      // We're either substitution explicitly-specified template arguments
277      // or deduced template arguments, so SFINAE applies.
278      return true;
279    }
280  }
281
282  return false;
283}
284
285//===----------------------------------------------------------------------===/
286// Template Instantiation for Types
287//===----------------------------------------------------------------------===/
288namespace {
289  class VISIBILITY_HIDDEN TemplateInstantiator
290    : public TreeTransform<TemplateInstantiator>
291  {
292    const TemplateArgumentList &TemplateArgs;
293    SourceLocation Loc;
294    DeclarationName Entity;
295
296  public:
297    TemplateInstantiator(Sema &SemaRef,
298                         const TemplateArgumentList &TemplateArgs,
299                         SourceLocation Loc,
300                         DeclarationName Entity)
301    : TreeTransform<TemplateInstantiator>(SemaRef), TemplateArgs(TemplateArgs),
302      Loc(Loc), Entity(Entity) { }
303
304    /// \brief Determine whether the given type \p T has already been
305    /// transformed.
306    ///
307    /// For the purposes of template instantiation, a type has already been
308    /// transformed if it is NULL or if it is not dependent.
309    bool AlreadyTransformed(QualType T) {
310      return T.isNull() || !T->isDependentType();
311    }
312
313    /// \brief Returns the location of the entity being instantiated, if known.
314    SourceLocation getBaseLocation() { return Loc; }
315
316    /// \brief Returns the name of the entity being instantiated, if any.
317    DeclarationName getBaseEntity() { return Entity; }
318
319    /// \brief Transforms an expression by instantiating it with the given
320    /// template arguments.
321    Sema::OwningExprResult TransformExpr(Expr *E);
322
323    /// \brief Transform the given declaration by instantiating a reference to
324    /// this declaration.
325    Decl *TransformDecl(Decl *D);
326
327    /// \brief Transform the given nested-name-specifier by instantiating it.
328    NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
329                                                      SourceRange Range);
330
331    /// \brief Transform the given template name by instantiating it.
332    TemplateName TransformTemplateName(TemplateName Template);
333
334    /// \brief Transform the given template argument by instantiating it.
335    TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
336
337    /// \brief Transforms a template type parameter type by performing
338    /// substitution of the corresponding template type argument.
339    QualType TransformTemplateTypeParmType(const TemplateTypeParmType *T);
340  };
341}
342
343Sema::OwningExprResult TemplateInstantiator::TransformExpr(Expr *E) {
344  return getSema().InstantiateExpr(E, TemplateArgs);
345}
346
347Decl *TemplateInstantiator::TransformDecl(Decl *D) {
348  return SemaRef.InstantiateCurrentDeclRef(cast_or_null<NamedDecl>(D));
349}
350
351NestedNameSpecifier *
352TemplateInstantiator::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
353                                                   SourceRange Range) {
354  return getSema().InstantiateNestedNameSpecifier(NNS, Range, TemplateArgs);
355}
356
357TemplateName
358TemplateInstantiator::TransformTemplateName(TemplateName Template) {
359  return getSema().InstantiateTemplateName(Template, /*FIXME*/Loc,
360                                           TemplateArgs);
361}
362
363TemplateArgument
364TemplateInstantiator::TransformTemplateArgument(const TemplateArgument &Arg) {
365  return getSema().Instantiate(Arg, TemplateArgs);
366}
367
368QualType
369TemplateInstantiator::TransformTemplateTypeParmType(
370                                              const TemplateTypeParmType *T) {
371  if (T->getDepth() == 0) {
372    // Replace the template type parameter with its corresponding
373    // template argument.
374
375    // FIXME: When dealing with member templates, we might end up with multiple
376    /// levels of template arguments that we're substituting into concurrently.
377
378    // If the corresponding template argument is NULL or doesn't exist, it's
379    // because we are performing instantiation from explicitly-specified
380    // template arguments in a function template class, but there were some
381    // arguments left unspecified.
382    if (T->getIndex() >= TemplateArgs.size() ||
383        TemplateArgs[T->getIndex()].isNull())
384      return QualType(T, 0); // Would be nice to keep the original type here
385
386    assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
387           "Template argument kind mismatch");
388    return TemplateArgs[T->getIndex()].getAsType();
389  }
390
391  // The template type parameter comes from an inner template (e.g.,
392  // the template parameter list of a member template inside the
393  // template we are instantiating). Create a new template type
394  // parameter with the template "level" reduced by one.
395  return getSema().Context.getTemplateTypeParmType(T->getDepth() - 1,
396                                                   T->getIndex(),
397                                                   T->isParameterPack(),
398                                                   T->getName());
399}
400
401/// \brief Instantiate the type T with a given set of template arguments.
402///
403/// This routine substitutes the given template arguments into the
404/// type T and produces the instantiated type.
405///
406/// \param T the type into which the template arguments will be
407/// substituted. If this type is not dependent, it will be returned
408/// immediately.
409///
410/// \param TemplateArgs the template arguments that will be
411/// substituted for the top-level template parameters within T.
412///
413/// \param Loc the location in the source code where this substitution
414/// is being performed. It will typically be the location of the
415/// declarator (if we're instantiating the type of some declaration)
416/// or the location of the type in the source code (if, e.g., we're
417/// instantiating the type of a cast expression).
418///
419/// \param Entity the name of the entity associated with a declaration
420/// being instantiated (if any). May be empty to indicate that there
421/// is no such entity (if, e.g., this is a type that occurs as part of
422/// a cast expression) or that the entity has no name (e.g., an
423/// unnamed function parameter).
424///
425/// \returns If the instantiation succeeds, the instantiated
426/// type. Otherwise, produces diagnostics and returns a NULL type.
427QualType Sema::InstantiateType(QualType T,
428                               const TemplateArgumentList &TemplateArgs,
429                               SourceLocation Loc, DeclarationName Entity) {
430  assert(!ActiveTemplateInstantiations.empty() &&
431         "Cannot perform an instantiation without some context on the "
432         "instantiation stack");
433
434  // If T is not a dependent type, there is nothing to do.
435  if (!T->isDependentType())
436    return T;
437
438  TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
439  return Instantiator.TransformType(T);
440}
441
442/// \brief Instantiate the base class specifiers of the given class
443/// template specialization.
444///
445/// Produces a diagnostic and returns true on error, returns false and
446/// attaches the instantiated base classes to the class template
447/// specialization if successful.
448bool
449Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,
450                                CXXRecordDecl *Pattern,
451                                const TemplateArgumentList &TemplateArgs) {
452  bool Invalid = false;
453  llvm::SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases;
454  for (ClassTemplateSpecializationDecl::base_class_iterator
455         Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end();
456       Base != BaseEnd; ++Base) {
457    if (!Base->getType()->isDependentType()) {
458      InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(*Base));
459      continue;
460    }
461
462    QualType BaseType = InstantiateType(Base->getType(),
463                                        TemplateArgs,
464                                        Base->getSourceRange().getBegin(),
465                                        DeclarationName());
466    if (BaseType.isNull()) {
467      Invalid = true;
468      continue;
469    }
470
471    if (CXXBaseSpecifier *InstantiatedBase
472          = CheckBaseSpecifier(Instantiation,
473                               Base->getSourceRange(),
474                               Base->isVirtual(),
475                               Base->getAccessSpecifierAsWritten(),
476                               BaseType,
477                               /*FIXME: Not totally accurate */
478                               Base->getSourceRange().getBegin()))
479      InstantiatedBases.push_back(InstantiatedBase);
480    else
481      Invalid = true;
482  }
483
484  if (!Invalid &&
485      AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(),
486                           InstantiatedBases.size()))
487    Invalid = true;
488
489  return Invalid;
490}
491
492/// \brief Instantiate the definition of a class from a given pattern.
493///
494/// \param PointOfInstantiation The point of instantiation within the
495/// source code.
496///
497/// \param Instantiation is the declaration whose definition is being
498/// instantiated. This will be either a class template specialization
499/// or a member class of a class template specialization.
500///
501/// \param Pattern is the pattern from which the instantiation
502/// occurs. This will be either the declaration of a class template or
503/// the declaration of a member class of a class template.
504///
505/// \param TemplateArgs The template arguments to be substituted into
506/// the pattern.
507///
508/// \returns true if an error occurred, false otherwise.
509bool
510Sema::InstantiateClass(SourceLocation PointOfInstantiation,
511                       CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
512                       const TemplateArgumentList &TemplateArgs,
513                       bool ExplicitInstantiation) {
514  bool Invalid = false;
515
516  CXXRecordDecl *PatternDef
517    = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context));
518  if (!PatternDef) {
519    if (Pattern == Instantiation->getInstantiatedFromMemberClass()) {
520      Diag(PointOfInstantiation,
521           diag::err_implicit_instantiate_member_undefined)
522        << Context.getTypeDeclType(Instantiation);
523      Diag(Pattern->getLocation(), diag::note_member_of_template_here);
524    } else {
525      Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
526        << ExplicitInstantiation
527        << Context.getTypeDeclType(Instantiation);
528      Diag(Pattern->getLocation(), diag::note_template_decl_here);
529    }
530    return true;
531  }
532  Pattern = PatternDef;
533
534  InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
535  if (Inst)
536    return true;
537
538  // Enter the scope of this instantiation. We don't use
539  // PushDeclContext because we don't have a scope.
540  DeclContext *PreviousContext = CurContext;
541  CurContext = Instantiation;
542
543  // Start the definition of this instantiation.
544  Instantiation->startDefinition();
545
546  // Instantiate the base class specifiers.
547  if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
548    Invalid = true;
549
550  llvm::SmallVector<DeclPtrTy, 4> Fields;
551  for (RecordDecl::decl_iterator Member = Pattern->decls_begin(),
552         MemberEnd = Pattern->decls_end();
553       Member != MemberEnd; ++Member) {
554    Decl *NewMember = InstantiateDecl(*Member, Instantiation, TemplateArgs);
555    if (NewMember) {
556      if (NewMember->isInvalidDecl())
557        Invalid = true;
558      else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember))
559        Fields.push_back(DeclPtrTy::make(Field));
560    } else {
561      // FIXME: Eventually, a NULL return will mean that one of the
562      // instantiations was a semantic disaster, and we'll want to set Invalid =
563      // true. For now, we expect to skip some members that we can't yet handle.
564    }
565  }
566
567  // Finish checking fields.
568  ActOnFields(0, Instantiation->getLocation(), DeclPtrTy::make(Instantiation),
569              Fields.data(), Fields.size(), SourceLocation(), SourceLocation(),
570              0);
571
572  // Add any implicitly-declared members that we might need.
573  AddImplicitlyDeclaredMembersToClass(Instantiation);
574
575  // Exit the scope of this instantiation.
576  CurContext = PreviousContext;
577
578  if (!Invalid)
579    Consumer.HandleTagDeclDefinition(Instantiation);
580
581  // If this is an explicit instantiation, instantiate our members, too.
582  if (!Invalid && ExplicitInstantiation) {
583    Inst.Clear();
584    InstantiateClassMembers(PointOfInstantiation, Instantiation, TemplateArgs);
585  }
586
587  return Invalid;
588}
589
590bool
591Sema::InstantiateClassTemplateSpecialization(
592                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
593                           bool ExplicitInstantiation) {
594  // Perform the actual instantiation on the canonical declaration.
595  ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
596                                         ClassTemplateSpec->getCanonicalDecl());
597
598  // We can only instantiate something that hasn't already been
599  // instantiated or specialized. Fail without any diagnostics: our
600  // caller will provide an error message.
601  if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
602    return true;
603
604  ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
605  CXXRecordDecl *Pattern = Template->getTemplatedDecl();
606  const TemplateArgumentList *TemplateArgs
607    = &ClassTemplateSpec->getTemplateArgs();
608
609  // C++ [temp.class.spec.match]p1:
610  //   When a class template is used in a context that requires an
611  //   instantiation of the class, it is necessary to determine
612  //   whether the instantiation is to be generated using the primary
613  //   template or one of the partial specializations. This is done by
614  //   matching the template arguments of the class template
615  //   specialization with the template argument lists of the partial
616  //   specializations.
617  typedef std::pair<ClassTemplatePartialSpecializationDecl *,
618                    TemplateArgumentList *> MatchResult;
619  llvm::SmallVector<MatchResult, 4> Matched;
620  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
621         Partial = Template->getPartialSpecializations().begin(),
622         PartialEnd = Template->getPartialSpecializations().end();
623       Partial != PartialEnd;
624       ++Partial) {
625    TemplateDeductionInfo Info(Context);
626    if (TemplateDeductionResult Result
627          = DeduceTemplateArguments(&*Partial,
628                                    ClassTemplateSpec->getTemplateArgs(),
629                                    Info)) {
630      // FIXME: Store the failed-deduction information for use in
631      // diagnostics, later.
632      (void)Result;
633    } else {
634      Matched.push_back(std::make_pair(&*Partial, Info.take()));
635    }
636  }
637
638  if (Matched.size() == 1) {
639    //   -- If exactly one matching specialization is found, the
640    //      instantiation is generated from that specialization.
641    Pattern = Matched[0].first;
642    TemplateArgs = Matched[0].second;
643    ClassTemplateSpec->setInstantiationOf(Matched[0].first, Matched[0].second);
644  } else if (Matched.size() > 1) {
645    //   -- If more than one matching specialization is found, the
646    //      partial order rules (14.5.4.2) are used to determine
647    //      whether one of the specializations is more specialized
648    //      than the others. If none of the specializations is more
649    //      specialized than all of the other matching
650    //      specializations, then the use of the class template is
651    //      ambiguous and the program is ill-formed.
652    // FIXME: Implement partial ordering of class template partial
653    // specializations.
654    Diag(ClassTemplateSpec->getLocation(),
655         diag::unsup_template_partial_spec_ordering);
656  } else {
657    //   -- If no matches are found, the instantiation is generated
658    //      from the primary template.
659
660    // Since we initialized the pattern and template arguments from
661    // the primary template, there is nothing more we need to do here.
662  }
663
664  // Note that this is an instantiation.
665  ClassTemplateSpec->setSpecializationKind(
666                        ExplicitInstantiation? TSK_ExplicitInstantiation
667                                             : TSK_ImplicitInstantiation);
668
669  bool Result = InstantiateClass(ClassTemplateSpec->getLocation(),
670                                 ClassTemplateSpec, Pattern, *TemplateArgs,
671                                 ExplicitInstantiation);
672
673  for (unsigned I = 0, N = Matched.size(); I != N; ++I) {
674    // FIXME: Implement TemplateArgumentList::Destroy!
675    //    if (Matched[I].first != Pattern)
676    //      Matched[I].second->Destroy(Context);
677  }
678
679  return Result;
680}
681
682/// \brief Instantiate the definitions of all of the member of the
683/// given class, which is an instantiation of a class template or a
684/// member class of a template.
685void
686Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
687                              CXXRecordDecl *Instantiation,
688                              const TemplateArgumentList &TemplateArgs) {
689  for (DeclContext::decl_iterator D = Instantiation->decls_begin(),
690                               DEnd = Instantiation->decls_end();
691       D != DEnd; ++D) {
692    if (FunctionDecl *Function = dyn_cast<FunctionDecl>(*D)) {
693      if (!Function->getBody())
694        InstantiateFunctionDefinition(PointOfInstantiation, Function);
695    } else if (VarDecl *Var = dyn_cast<VarDecl>(*D)) {
696      if (Var->isStaticDataMember())
697        InstantiateStaticDataMemberDefinition(PointOfInstantiation, Var);
698    } else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(*D)) {
699      if (!Record->isInjectedClassName() && !Record->getDefinition(Context)) {
700        assert(Record->getInstantiatedFromMemberClass() &&
701               "Missing instantiated-from-template information");
702        InstantiateClass(PointOfInstantiation, Record,
703                         Record->getInstantiatedFromMemberClass(),
704                         TemplateArgs, true);
705      }
706    }
707  }
708}
709
710/// \brief Instantiate the definitions of all of the members of the
711/// given class template specialization, which was named as part of an
712/// explicit instantiation.
713void Sema::InstantiateClassTemplateSpecializationMembers(
714                                           SourceLocation PointOfInstantiation,
715                          ClassTemplateSpecializationDecl *ClassTemplateSpec) {
716  // C++0x [temp.explicit]p7:
717  //   An explicit instantiation that names a class template
718  //   specialization is an explicit instantion of the same kind
719  //   (declaration or definition) of each of its members (not
720  //   including members inherited from base classes) that has not
721  //   been previously explicitly specialized in the translation unit
722  //   containing the explicit instantiation, except as described
723  //   below.
724  InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec,
725                          ClassTemplateSpec->getTemplateArgs());
726}
727
728/// \brief Instantiate a nested-name-specifier.
729NestedNameSpecifier *
730Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,
731                                     SourceRange Range,
732                                     const TemplateArgumentList &TemplateArgs) {
733  // Instantiate the prefix of this nested name specifier.
734  NestedNameSpecifier *Prefix = NNS->getPrefix();
735  if (Prefix) {
736    Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs);
737    if (!Prefix)
738      return 0;
739  }
740
741  switch (NNS->getKind()) {
742  case NestedNameSpecifier::Identifier: {
743    assert(Prefix &&
744           "Can't have an identifier nested-name-specifier with no prefix");
745    CXXScopeSpec SS;
746    // FIXME: The source location information is all wrong.
747    SS.setRange(Range);
748    SS.setScopeRep(Prefix);
749    return static_cast<NestedNameSpecifier *>(
750                                 ActOnCXXNestedNameSpecifier(0, SS,
751                                                             Range.getEnd(),
752                                                             Range.getEnd(),
753                                                    *NNS->getAsIdentifier()));
754    break;
755  }
756
757  case NestedNameSpecifier::Namespace:
758  case NestedNameSpecifier::Global:
759    return NNS;
760
761  case NestedNameSpecifier::TypeSpecWithTemplate:
762  case NestedNameSpecifier::TypeSpec: {
763    QualType T = QualType(NNS->getAsType(), 0);
764    if (!T->isDependentType())
765      return NNS;
766
767    T = InstantiateType(T, TemplateArgs, Range.getBegin(), DeclarationName());
768    if (T.isNull())
769      return 0;
770
771    if (T->isDependentType() || T->isRecordType() ||
772        (getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
773      assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
774      return NestedNameSpecifier::Create(Context, Prefix,
775                 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
776                                         T.getTypePtr());
777    }
778
779    Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
780    return 0;
781  }
782  }
783
784  // Required to silence a GCC warning
785  return 0;
786}
787
788TemplateName
789Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc,
790                              const TemplateArgumentList &TemplateArgs) {
791  if (TemplateTemplateParmDecl *TTP
792        = dyn_cast_or_null<TemplateTemplateParmDecl>(
793                                                 Name.getAsTemplateDecl())) {
794    assert(TTP->getDepth() == 0 &&
795           "Cannot reduce depth of a template template parameter");
796    assert(TemplateArgs[TTP->getPosition()].getAsDecl() &&
797           "Wrong kind of template template argument");
798    ClassTemplateDecl *ClassTemplate
799      = dyn_cast<ClassTemplateDecl>(
800                               TemplateArgs[TTP->getPosition()].getAsDecl());
801    assert(ClassTemplate && "Expected a class template");
802    if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
803      NestedNameSpecifier *NNS
804        = InstantiateNestedNameSpecifier(QTN->getQualifier(),
805                                         /*FIXME=*/SourceRange(Loc),
806                                         TemplateArgs);
807      if (NNS)
808        return Context.getQualifiedTemplateName(NNS,
809                                                QTN->hasTemplateKeyword(),
810                                                ClassTemplate);
811    }
812
813    return TemplateName(ClassTemplate);
814  } else if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
815    NestedNameSpecifier *NNS
816      = InstantiateNestedNameSpecifier(DTN->getQualifier(),
817                                       /*FIXME=*/SourceRange(Loc),
818                                       TemplateArgs);
819
820    if (!NNS) // FIXME: Not the best recovery strategy.
821      return Name;
822
823    if (NNS->isDependent())
824      return Context.getDependentTemplateName(NNS, DTN->getName());
825
826    // Somewhat redundant with ActOnDependentTemplateName.
827    CXXScopeSpec SS;
828    SS.setRange(SourceRange(Loc));
829    SS.setScopeRep(NNS);
830    TemplateTy Template;
831    TemplateNameKind TNK = isTemplateName(*DTN->getName(), 0, Template, &SS);
832    if (TNK == TNK_Non_template) {
833      Diag(Loc, diag::err_template_kw_refers_to_non_template)
834        << DTN->getName();
835      return Name;
836    } else if (TNK == TNK_Function_template) {
837      Diag(Loc, diag::err_template_kw_refers_to_non_template)
838        << DTN->getName();
839      return Name;
840    }
841
842    return Template.getAsVal<TemplateName>();
843  }
844
845
846
847  // FIXME: Even if we're referring to a Decl that isn't a template template
848  // parameter, we may need to instantiate the outer contexts of that
849  // Decl. However, this won't be needed until we implement member templates.
850  return Name;
851}
852
853TemplateArgument Sema::Instantiate(TemplateArgument Arg,
854                                   const TemplateArgumentList &TemplateArgs) {
855  switch (Arg.getKind()) {
856  case TemplateArgument::Null:
857    assert(false && "Should never have a NULL template argument");
858    break;
859
860  case TemplateArgument::Type: {
861    QualType T = InstantiateType(Arg.getAsType(), TemplateArgs,
862                                 Arg.getLocation(), DeclarationName());
863    if (T.isNull())
864      return TemplateArgument();
865
866    return TemplateArgument(Arg.getLocation(), T);
867  }
868
869  case TemplateArgument::Declaration:
870    // FIXME: Template instantiation for template template parameters.
871    return Arg;
872
873  case TemplateArgument::Integral:
874    return Arg;
875
876  case TemplateArgument::Expression: {
877    // Template argument expressions are not potentially evaluated.
878    EnterExpressionEvaluationContext Unevaluated(*this, Action::Unevaluated);
879
880    Sema::OwningExprResult E = InstantiateExpr(Arg.getAsExpr(), TemplateArgs);
881    if (E.isInvalid())
882      return TemplateArgument();
883    return TemplateArgument(E.takeAs<Expr>());
884  }
885
886  case TemplateArgument::Pack:
887    assert(0 && "FIXME: Implement!");
888    break;
889  }
890
891  assert(false && "Unhandled template argument kind");
892  return TemplateArgument();
893}
894