SemaTemplateInstantiate.cpp revision d30226003ea60119b19901b7813821c7ec3d7e55
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 "clang/AST/ASTContext.h"
15#include "clang/AST/Expr.h"
16#include "clang/AST/DeclTemplate.h"
17#include "clang/Parse/DeclSpec.h"
18#include "clang/Basic/LangOptions.h"
19#include "llvm/Support/Compiler.h"
20
21using namespace clang;
22
23//===----------------------------------------------------------------------===/
24// Template Instantiation Support
25//===----------------------------------------------------------------------===/
26
27Sema::InstantiatingTemplate::
28InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
29                      CXXRecordDecl *Entity,
30                      SourceRange InstantiationRange)
31  :  SemaRef(SemaRef) {
32
33  Invalid = CheckInstantiationDepth(PointOfInstantiation,
34                                    InstantiationRange);
35  if (!Invalid) {
36    ActiveTemplateInstantiation Inst;
37    Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation;
38    Inst.PointOfInstantiation = PointOfInstantiation;
39    Inst.Entity = reinterpret_cast<uintptr_t>(Entity);
40    Inst.TemplateArgs = 0;
41    Inst.NumTemplateArgs = 0;
42    Inst.InstantiationRange = InstantiationRange;
43    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
44    Invalid = false;
45  }
46}
47
48Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
49                                         SourceLocation PointOfInstantiation,
50                                         TemplateDecl *Template,
51                                         const TemplateArgument *TemplateArgs,
52                                         unsigned NumTemplateArgs,
53                                         SourceRange InstantiationRange)
54  : SemaRef(SemaRef) {
55
56  Invalid = CheckInstantiationDepth(PointOfInstantiation,
57                                    InstantiationRange);
58  if (!Invalid) {
59    ActiveTemplateInstantiation Inst;
60    Inst.Kind
61      = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation;
62    Inst.PointOfInstantiation = PointOfInstantiation;
63    Inst.Entity = reinterpret_cast<uintptr_t>(Template);
64    Inst.TemplateArgs = TemplateArgs;
65    Inst.NumTemplateArgs = NumTemplateArgs;
66    Inst.InstantiationRange = InstantiationRange;
67    SemaRef.ActiveTemplateInstantiations.push_back(Inst);
68    Invalid = false;
69  }
70}
71
72Sema::InstantiatingTemplate::~InstantiatingTemplate() {
73  if (!Invalid)
74    SemaRef.ActiveTemplateInstantiations.pop_back();
75}
76
77bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
78                                        SourceLocation PointOfInstantiation,
79                                           SourceRange InstantiationRange) {
80  if (SemaRef.ActiveTemplateInstantiations.size()
81       <= SemaRef.getLangOptions().InstantiationDepth)
82    return false;
83
84  SemaRef.Diag(PointOfInstantiation,
85               diag::err_template_recursion_depth_exceeded)
86    << SemaRef.getLangOptions().InstantiationDepth
87    << InstantiationRange;
88  SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
89    << SemaRef.getLangOptions().InstantiationDepth;
90  return true;
91}
92
93/// \brief Prints the current instantiation stack through a series of
94/// notes.
95void Sema::PrintInstantiationStack() {
96  for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
97         Active = ActiveTemplateInstantiations.rbegin(),
98         ActiveEnd = ActiveTemplateInstantiations.rend();
99       Active != ActiveEnd;
100       ++Active) {
101    switch (Active->Kind) {
102    case ActiveTemplateInstantiation::TemplateInstantiation: {
103      unsigned DiagID = diag::note_template_member_class_here;
104      CXXRecordDecl *Record = (CXXRecordDecl *)Active->Entity;
105      if (isa<ClassTemplateSpecializationDecl>(Record))
106        DiagID = diag::note_template_class_instantiation_here;
107      Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
108                   DiagID)
109        << Context.getTypeDeclType(Record)
110        << Active->InstantiationRange;
111      break;
112    }
113
114    case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
115      TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity);
116      std::string TemplateArgsStr
117        = ClassTemplateSpecializationType::PrintTemplateArgumentList(
118                                                      Active->TemplateArgs,
119                                                      Active->NumTemplateArgs);
120      Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
121                   diag::note_default_arg_instantiation_here)
122        << (Template->getNameAsString() + TemplateArgsStr)
123        << Active->InstantiationRange;
124      break;
125    }
126    }
127  }
128}
129
130//===----------------------------------------------------------------------===/
131// Template Instantiation for Types
132//===----------------------------------------------------------------------===/
133namespace {
134  class VISIBILITY_HIDDEN TemplateTypeInstantiator {
135    Sema &SemaRef;
136    const TemplateArgument *TemplateArgs;
137    unsigned NumTemplateArgs;
138    SourceLocation Loc;
139    DeclarationName Entity;
140
141  public:
142    TemplateTypeInstantiator(Sema &SemaRef,
143                             const TemplateArgument *TemplateArgs,
144                             unsigned NumTemplateArgs,
145                             SourceLocation Loc,
146                             DeclarationName Entity)
147      : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
148        NumTemplateArgs(NumTemplateArgs), Loc(Loc), Entity(Entity) { }
149
150    QualType operator()(QualType T) const { return Instantiate(T); }
151
152    QualType Instantiate(QualType T) const;
153
154    // Declare instantiate functions for each type.
155#define TYPE(Class, Base)                                       \
156    QualType Instantiate##Class##Type(const Class##Type *T,     \
157                                      unsigned Quals) const;
158#define ABSTRACT_TYPE(Class, Base)
159#include "clang/AST/TypeNodes.def"
160  };
161}
162
163QualType
164TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T,
165                                                 unsigned Quals) const {
166  // FIXME: Implement this
167  assert(false && "Cannot instantiate ExtQualType yet");
168  return QualType();
169}
170
171QualType
172TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T,
173                                                 unsigned Quals) const {
174  assert(false && "Builtin types are not dependent and cannot be instantiated");
175  return QualType(T, Quals);
176}
177
178QualType
179TemplateTypeInstantiator::
180InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const {
181  // FIXME: Implement this
182  assert(false && "Cannot instantiate FixedWidthIntType yet");
183  return QualType();
184}
185
186QualType
187TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T,
188                                                 unsigned Quals) const {
189  // FIXME: Implement this
190  assert(false && "Cannot instantiate ComplexType yet");
191  return QualType();
192}
193
194QualType
195TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T,
196                                                 unsigned Quals) const {
197  QualType PointeeType = Instantiate(T->getPointeeType());
198  if (PointeeType.isNull())
199    return QualType();
200
201  return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity);
202}
203
204QualType
205TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T,
206                                                      unsigned Quals) const {
207  // FIXME: Implement this
208  assert(false && "Cannot instantiate BlockPointerType yet");
209  return QualType();
210}
211
212QualType
213TemplateTypeInstantiator::InstantiateLValueReferenceType(
214    const LValueReferenceType *T, unsigned Quals) const {
215  QualType ReferentType = Instantiate(T->getPointeeType());
216  if (ReferentType.isNull())
217    return QualType();
218
219  return SemaRef.BuildReferenceType(ReferentType, true, Quals, Loc, Entity);
220}
221
222QualType
223TemplateTypeInstantiator::InstantiateRValueReferenceType(
224    const RValueReferenceType *T, unsigned Quals) const {
225  QualType ReferentType = Instantiate(T->getPointeeType());
226  if (ReferentType.isNull())
227    return QualType();
228
229  return SemaRef.BuildReferenceType(ReferentType, false, Quals, Loc, Entity);
230}
231
232QualType
233TemplateTypeInstantiator::
234InstantiateMemberPointerType(const MemberPointerType *T,
235                             unsigned Quals) const {
236  // FIXME: Implement this
237  assert(false && "Cannot instantiate MemberPointerType yet");
238  return QualType();
239}
240
241QualType
242TemplateTypeInstantiator::
243InstantiateConstantArrayType(const ConstantArrayType *T,
244                             unsigned Quals) const {
245  QualType ElementType = Instantiate(T->getElementType());
246  if (ElementType.isNull())
247    return ElementType;
248
249  // Build a temporary integer literal to specify the size for
250  // BuildArrayType. Since we have already checked the size as part of
251  // creating the dependent array type in the first place, we know
252  // there aren't any errors.
253  // FIXME: Is IntTy big enough? Maybe not, but LongLongTy causes
254  // problems that I have yet to investigate.
255  IntegerLiteral ArraySize(T->getSize(), SemaRef.Context.IntTy, Loc);
256  return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
257                                &ArraySize, T->getIndexTypeQualifier(),
258                                Loc, Entity);
259}
260
261QualType
262TemplateTypeInstantiator::
263InstantiateIncompleteArrayType(const IncompleteArrayType *T,
264                               unsigned Quals) const {
265  QualType ElementType = Instantiate(T->getElementType());
266  if (ElementType.isNull())
267    return ElementType;
268
269  return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
270                                0, T->getIndexTypeQualifier(),
271                                Loc, Entity);
272}
273
274QualType
275TemplateTypeInstantiator::
276InstantiateVariableArrayType(const VariableArrayType *T,
277                             unsigned Quals) const {
278  // FIXME: Implement this
279  assert(false && "Cannot instantiate VariableArrayType yet");
280  return QualType();
281}
282
283QualType
284TemplateTypeInstantiator::
285InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,
286                                   unsigned Quals) const {
287  Expr *ArraySize = T->getSizeExpr();
288  assert(ArraySize->isValueDependent() &&
289         "dependent sized array types must have value dependent size expr");
290
291  // Instantiate the element type if needed
292  QualType ElementType = T->getElementType();
293  if (ElementType->isDependentType()) {
294    ElementType = Instantiate(ElementType);
295    if (ElementType.isNull())
296      return QualType();
297  }
298
299  // Instantiate the size expression
300  Sema::OwningExprResult InstantiatedArraySize =
301    SemaRef.InstantiateExpr(ArraySize, TemplateArgs, NumTemplateArgs);
302  if (InstantiatedArraySize.isInvalid())
303    return QualType();
304
305  return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
306                                (Expr *)InstantiatedArraySize.release(),
307                                T->getIndexTypeQualifier(), Loc, Entity);
308}
309
310QualType
311TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T,
312                                             unsigned Quals) const {
313  // FIXME: Implement this
314  assert(false && "Cannot instantiate VectorType yet");
315  return QualType();
316}
317
318QualType
319TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T,
320                                                   unsigned Quals) const {
321  // FIXME: Implement this
322  assert(false && "Cannot instantiate ExtVectorType yet");
323  return QualType();
324}
325
326QualType
327TemplateTypeInstantiator::
328InstantiateFunctionProtoType(const FunctionProtoType *T,
329                             unsigned Quals) const {
330  QualType ResultType = Instantiate(T->getResultType());
331  if (ResultType.isNull())
332    return ResultType;
333
334  llvm::SmallVector<QualType, 16> ParamTypes;
335  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
336                                         ParamEnd = T->arg_type_end();
337       Param != ParamEnd; ++Param) {
338    QualType P = Instantiate(*Param);
339    if (P.isNull())
340      return P;
341
342    ParamTypes.push_back(P);
343  }
344
345  return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0],
346                                   ParamTypes.size(),
347                                   T->isVariadic(), T->getTypeQuals(),
348                                   Loc, Entity);
349}
350
351QualType
352TemplateTypeInstantiator::
353InstantiateFunctionNoProtoType(const FunctionNoProtoType *T,
354                               unsigned Quals) const {
355  assert(false && "Functions without prototypes cannot be dependent.");
356  return QualType();
357}
358
359QualType
360TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T,
361                                                 unsigned Quals) const {
362  // FIXME: Implement this
363  assert(false && "Cannot instantiate TypedefType yet");
364  return QualType();
365}
366
367QualType
368TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T,
369                                                    unsigned Quals) const {
370  // FIXME: Implement this
371  assert(false && "Cannot instantiate TypeOfExprType yet");
372  return QualType();
373}
374
375QualType
376TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T,
377                                                unsigned Quals) const {
378  // FIXME: Implement this
379  assert(false && "Cannot instantiate TypeOfType yet");
380  return QualType();
381}
382
383QualType
384TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T,
385                                                unsigned Quals) const {
386  // FIXME: Implement this
387  assert(false && "Cannot instantiate RecordType yet");
388  return QualType();
389}
390
391QualType
392TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T,
393                                              unsigned Quals) const {
394  // FIXME: Implement this
395  assert(false && "Cannot instantiate EnumType yet");
396  return QualType();
397}
398
399QualType
400TemplateTypeInstantiator::
401InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,
402                                unsigned Quals) const {
403  if (T->getDepth() == 0) {
404    // Replace the template type parameter with its corresponding
405    // template argument.
406    assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args");
407    assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
408           "Template argument kind mismatch");
409    QualType Result = TemplateArgs[T->getIndex()].getAsType();
410    if (Result.isNull() || !Quals)
411      return Result;
412
413    // C++ [dcl.ref]p1:
414    //   [...] Cv-qualified references are ill-formed except when
415    //   the cv-qualifiers are introduced through the use of a
416    //   typedef (7.1.3) or of a template type argument (14.3), in
417    //   which case the cv-qualifiers are ignored.
418    if (Quals && Result->isReferenceType())
419      Quals = 0;
420
421    return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers());
422  }
423
424  // The template type parameter comes from an inner template (e.g.,
425  // the template parameter list of a member template inside the
426  // template we are instantiating). Create a new template type
427  // parameter with the template "level" reduced by one.
428  return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
429                                                 T->getIndex(),
430                                                 T->getName())
431    .getQualifiedType(Quals);
432}
433
434QualType
435TemplateTypeInstantiator::
436InstantiateClassTemplateSpecializationType(
437                                  const ClassTemplateSpecializationType *T,
438                                  unsigned Quals) const {
439  llvm::SmallVector<TemplateArgument, 16> InstantiatedTemplateArgs;
440  InstantiatedTemplateArgs.reserve(T->getNumArgs());
441  for (ClassTemplateSpecializationType::iterator Arg = T->begin(),
442                                              ArgEnd = T->end();
443       Arg != ArgEnd; ++Arg) {
444    switch (Arg->getKind()) {
445    case TemplateArgument::Type: {
446      QualType T = SemaRef.InstantiateType(Arg->getAsType(),
447                                           TemplateArgs, NumTemplateArgs,
448                                           Arg->getLocation(),
449                                           DeclarationName());
450      if (T.isNull())
451        return QualType();
452
453      InstantiatedTemplateArgs.push_back(
454                                TemplateArgument(Arg->getLocation(), T));
455      break;
456    }
457
458    case TemplateArgument::Declaration:
459    case TemplateArgument::Integral:
460      InstantiatedTemplateArgs.push_back(*Arg);
461      break;
462
463    case TemplateArgument::Expression:
464      Sema::OwningExprResult E
465        = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs,
466                                  NumTemplateArgs);
467      if (E.isInvalid())
468        return QualType();
469      InstantiatedTemplateArgs.push_back((Expr *)E.release());
470      break;
471    }
472  }
473
474  // FIXME: We're missing the locations of the template name, '<', and
475  // '>'.
476  return SemaRef.CheckClassTemplateId(cast<ClassTemplateDecl>(T->getTemplate()),
477                                      Loc,
478                                      SourceLocation(),
479                                      &InstantiatedTemplateArgs[0],
480                                      InstantiatedTemplateArgs.size(),
481                                      SourceLocation());
482}
483
484QualType
485TemplateTypeInstantiator::
486InstantiateQualifiedNameType(const QualifiedNameType *T,
487                             unsigned Quals) const {
488  // When we instantiated a qualified name type, there's no point in
489  // keeping the qualification around in the instantiated result. So,
490  // just instantiate the named type.
491  return (*this)(T->getNamedType());
492}
493
494QualType
495TemplateTypeInstantiator::
496InstantiateTypenameType(const TypenameType *T, unsigned Quals) const {
497  NestedNameSpecifier *NNS
498    = SemaRef.InstantiateNestedNameSpecifier(T->getQualifier(),
499                                             SourceRange(Loc),
500                                             TemplateArgs, NumTemplateArgs);
501  if (!NNS)
502    return QualType();
503
504  return SemaRef.CheckTypenameType(NNS, *T->getName(), SourceRange(Loc));
505}
506
507QualType
508TemplateTypeInstantiator::
509InstantiateObjCInterfaceType(const ObjCInterfaceType *T,
510                             unsigned Quals) const {
511  assert(false && "Objective-C types cannot be dependent");
512  return QualType();
513}
514
515QualType
516TemplateTypeInstantiator::
517InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T,
518                                      unsigned Quals) const {
519  assert(false && "Objective-C types cannot be dependent");
520  return QualType();
521}
522
523QualType
524TemplateTypeInstantiator::
525InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T,
526                               unsigned Quals) const {
527  assert(false && "Objective-C types cannot be dependent");
528  return QualType();
529}
530
531QualType
532TemplateTypeInstantiator::
533InstantiateObjCQualifiedClassType(const ObjCQualifiedClassType *T,
534                                  unsigned Quals) const {
535  assert(false && "Objective-C types cannot be dependent");
536  return QualType();
537}
538
539/// \brief The actual implementation of Sema::InstantiateType().
540QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
541  // If T is not a dependent type, there is nothing to do.
542  if (!T->isDependentType())
543    return T;
544
545  switch (T->getTypeClass()) {
546#define TYPE(Class, Base)                                               \
547  case Type::Class:                                                     \
548    return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()),  \
549                                    T.getCVRQualifiers());
550#define ABSTRACT_TYPE(Class, Base)
551#include "clang/AST/TypeNodes.def"
552  }
553
554  assert(false && "Not all types have been decoded for instantiation");
555  return QualType();
556}
557
558/// \brief Instantiate the type T with a given set of template arguments.
559///
560/// This routine substitutes the given template arguments into the
561/// type T and produces the instantiated type.
562///
563/// \param T the type into which the template arguments will be
564/// substituted. If this type is not dependent, it will be returned
565/// immediately.
566///
567/// \param TemplateArgs the template arguments that will be
568/// substituted for the top-level template parameters within T.
569///
570/// \param NumTemplateArgs the number of template arguments provided
571/// by TemplateArgs.
572///
573/// \param Loc the location in the source code where this substitution
574/// is being performed. It will typically be the location of the
575/// declarator (if we're instantiating the type of some declaration)
576/// or the location of the type in the source code (if, e.g., we're
577/// instantiating the type of a cast expression).
578///
579/// \param Entity the name of the entity associated with a declaration
580/// being instantiated (if any). May be empty to indicate that there
581/// is no such entity (if, e.g., this is a type that occurs as part of
582/// a cast expression) or that the entity has no name (e.g., an
583/// unnamed function parameter).
584///
585/// \returns If the instantiation succeeds, the instantiated
586/// type. Otherwise, produces diagnostics and returns a NULL type.
587QualType Sema::InstantiateType(QualType T,
588                               const TemplateArgument *TemplateArgs,
589                               unsigned NumTemplateArgs,
590                               SourceLocation Loc, DeclarationName Entity) {
591  assert(!ActiveTemplateInstantiations.empty() &&
592         "Cannot perform an instantiation without some context on the "
593         "instantiation stack");
594
595  // If T is not a dependent type, there is nothing to do.
596  if (!T->isDependentType())
597    return T;
598
599  TemplateTypeInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs,
600                                        Loc, Entity);
601  return Instantiator(T);
602}
603
604/// \brief Instantiate the base class specifiers of the given class
605/// template specialization.
606///
607/// Produces a diagnostic and returns true on error, returns false and
608/// attaches the instantiated base classes to the class template
609/// specialization if successful.
610bool
611Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,
612                                CXXRecordDecl *Pattern,
613                                const TemplateArgument *TemplateArgs,
614                                unsigned NumTemplateArgs) {
615  bool Invalid = false;
616  llvm::SmallVector<CXXBaseSpecifier*, 8> InstantiatedBases;
617  for (ClassTemplateSpecializationDecl::base_class_iterator
618         Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end();
619       Base != BaseEnd; ++Base) {
620    if (!Base->getType()->isDependentType()) {
621      // FIXME: Allocate via ASTContext
622      InstantiatedBases.push_back(new CXXBaseSpecifier(*Base));
623      continue;
624    }
625
626    QualType BaseType = InstantiateType(Base->getType(),
627                                        TemplateArgs, NumTemplateArgs,
628                                        Base->getSourceRange().getBegin(),
629                                        DeclarationName());
630    if (BaseType.isNull()) {
631      Invalid = true;
632      continue;
633    }
634
635    if (CXXBaseSpecifier *InstantiatedBase
636          = CheckBaseSpecifier(Instantiation,
637                               Base->getSourceRange(),
638                               Base->isVirtual(),
639                               Base->getAccessSpecifierAsWritten(),
640                               BaseType,
641                               /*FIXME: Not totally accurate */
642                               Base->getSourceRange().getBegin()))
643      InstantiatedBases.push_back(InstantiatedBase);
644    else
645      Invalid = true;
646  }
647
648  if (!Invalid &&
649      AttachBaseSpecifiers(Instantiation, &InstantiatedBases[0],
650                           InstantiatedBases.size()))
651    Invalid = true;
652
653  return Invalid;
654}
655
656/// \brief Instantiate the definition of a class from a given pattern.
657///
658/// \param PointOfInstantiation The point of instantiation within the
659/// source code.
660///
661/// \param Instantiation is the declaration whose definition is being
662/// instantiated. This will be either a class template specialization
663/// or a member class of a class template specialization.
664///
665/// \param Pattern is the pattern from which the instantiation
666/// occurs. This will be either the declaration of a class template or
667/// the declaration of a member class of a class template.
668///
669/// \param TemplateArgs The template arguments to be substituted into
670/// the pattern.
671///
672/// \param NumTemplateArgs The number of templates arguments in
673/// TemplateArgs.
674///
675/// \returns true if an error occurred, false otherwise.
676bool
677Sema::InstantiateClass(SourceLocation PointOfInstantiation,
678                       CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
679                       const TemplateArgument *TemplateArgs,
680                       unsigned NumTemplateArgs) {
681  bool Invalid = false;
682
683  CXXRecordDecl *PatternDef
684    = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context));
685  if (!PatternDef) {
686    if (Pattern == Instantiation->getInstantiatedFromMemberClass()) {
687      Diag(PointOfInstantiation,
688           diag::err_implicit_instantiate_member_undefined)
689        << Context.getTypeDeclType(Instantiation);
690      Diag(Pattern->getLocation(), diag::note_member_of_template_here);
691    } else {
692      Diag(PointOfInstantiation,
693           diag::err_template_implicit_instantiate_undefined)
694        << Context.getTypeDeclType(Instantiation);
695      Diag(Pattern->getLocation(), diag::note_template_decl_here);
696    }
697    return true;
698  }
699  Pattern = PatternDef;
700
701  InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
702  if (Inst)
703    return true;
704
705  // Enter the scope of this instantiation. We don't use
706  // PushDeclContext because we don't have a scope.
707  DeclContext *PreviousContext = CurContext;
708  CurContext = Instantiation;
709
710  // Start the definition of this instantiation.
711  Instantiation->startDefinition();
712
713  // Instantiate the base class specifiers.
714  if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs,
715                                NumTemplateArgs))
716    Invalid = true;
717
718  llvm::SmallVector<DeclTy *, 32> Fields;
719  for (RecordDecl::decl_iterator Member = Pattern->decls_begin(),
720                              MemberEnd = Pattern->decls_end();
721       Member != MemberEnd; ++Member) {
722    Decl *NewMember = InstantiateDecl(*Member, Instantiation,
723                                      TemplateArgs, NumTemplateArgs);
724    if (NewMember) {
725      if (NewMember->isInvalidDecl())
726        Invalid = true;
727      else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember))
728        Fields.push_back(Field);
729    } else {
730      // FIXME: Eventually, a NULL return will mean that one of the
731      // instantiations was a semantic disaster, and we'll want to set
732      // Invalid = true. For now, we expect to skip some members that
733      // we can't yet handle.
734    }
735  }
736
737  // Finish checking fields.
738  ActOnFields(0, Instantiation->getLocation(), Instantiation,
739              &Fields[0], Fields.size(), SourceLocation(), SourceLocation(),
740              0);
741
742  // Add any implicitly-declared members that we might need.
743  AddImplicitlyDeclaredMembersToClass(Instantiation);
744
745  // Exit the scope of this instantiation.
746  CurContext = PreviousContext;
747
748  return Invalid;
749}
750
751bool
752Sema::InstantiateClassTemplateSpecialization(
753                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
754                           bool ExplicitInstantiation) {
755  // Perform the actual instantiation on the canonical declaration.
756  ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
757                               Context.getCanonicalDecl(ClassTemplateSpec));
758
759  // We can only instantiate something that hasn't already been
760  // instantiated or specialized. Fail without any diagnostics: our
761  // caller will provide an error message.
762  if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
763    return true;
764
765  // FIXME: Push this class template instantiation onto the
766  // instantiation stack, checking for recursion that exceeds a
767  // certain depth.
768
769  // FIXME: Perform class template partial specialization to select
770  // the best template.
771  ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
772
773  CXXRecordDecl *Pattern = Template->getTemplatedDecl();
774
775  // Note that this is an instantiation.
776  ClassTemplateSpec->setSpecializationKind(
777                        ExplicitInstantiation? TSK_ExplicitInstantiation
778                                             : TSK_ImplicitInstantiation);
779
780  return InstantiateClass(ClassTemplateSpec->getLocation(),
781                          ClassTemplateSpec, Pattern,
782                          ClassTemplateSpec->getTemplateArgs(),
783                          ClassTemplateSpec->getNumTemplateArgs());
784}
785
786/// \brief Instantiate a nested-name-specifier.
787NestedNameSpecifier *
788Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,
789                                     SourceRange Range,
790                                     const TemplateArgument *TemplateArgs,
791                                     unsigned NumTemplateArgs) {
792  // Instantiate the prefix of this nested name specifier.
793  NestedNameSpecifier *Prefix = NNS->getPrefix();
794  if (Prefix) {
795    Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs,
796                                            NumTemplateArgs);
797    if (!Prefix)
798      return 0;
799  }
800
801  switch (NNS->getKind()) {
802  case NestedNameSpecifier::Identifier:
803    // FIXME: Implement this lookup!
804    assert(false && "Cannot instantiate this nested-name-specifier");
805    break;
806
807  case NestedNameSpecifier::Namespace:
808  case NestedNameSpecifier::Global:
809    return NNS;
810
811  case NestedNameSpecifier::TypeSpecWithTemplate:
812  case NestedNameSpecifier::TypeSpec: {
813    QualType T = QualType(NNS->getAsType(), 0);
814    if (!T->isDependentType())
815      return NNS;
816
817    // FIXME: We won't be able to perform the instantiation here when
818    // the template-name is dependent, e.g., we have something like
819    // "T::template apply<U>::type".
820    T = InstantiateType(T, TemplateArgs, NumTemplateArgs, Range.getBegin(),
821                        DeclarationName());
822    if (T.isNull())
823      return 0;
824
825    if (T->isRecordType() ||
826        (getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
827      // Note that T.getTypePtr(), below, strips cv-qualifiers. This is
828      // perfectly reasonable, since cv-qualified types in
829      // nested-name-specifiers don't matter.
830      return NestedNameSpecifier::Create(Context, Prefix,
831                 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
832                                         T.getTypePtr());
833    }
834
835    Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
836    return 0;
837  }
838  }
839
840  // Required to silence a GCC warning
841  return 0;
842}
843