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