SemaTemplateInstantiate.cpp revision ed3a398adc9a7745c2acc3fa0ad4a906149ef2de
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/ExprCXX.h"
17#include "clang/AST/DeclTemplate.h"
18#include "clang/Parse/DeclSpec.h"
19#include "clang/Basic/LangOptions.h"
20#include "llvm/Support/Compiler.h"
21
22using namespace clang;
23
24//===----------------------------------------------------------------------===/
25// Template Instantiation for Types
26//===----------------------------------------------------------------------===/
27namespace {
28  class VISIBILITY_HIDDEN TemplateTypeInstantiator {
29    Sema &SemaRef;
30    const TemplateArgument *TemplateArgs;
31    unsigned NumTemplateArgs;
32    SourceLocation Loc;
33    DeclarationName Entity;
34
35  public:
36    TemplateTypeInstantiator(Sema &SemaRef,
37                             const TemplateArgument *TemplateArgs,
38                             unsigned NumTemplateArgs,
39                             SourceLocation Loc,
40                             DeclarationName Entity)
41      : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
42        NumTemplateArgs(NumTemplateArgs), Loc(Loc), Entity(Entity) { }
43
44    QualType operator()(QualType T) const { return Instantiate(T); }
45
46    QualType Instantiate(QualType T) const;
47
48    // Declare instantiate functions for each type.
49#define TYPE(Class, Base)                                       \
50    QualType Instantiate##Class##Type(const Class##Type *T,     \
51                                      unsigned Quals) const;
52#define ABSTRACT_TYPE(Class, Base)
53#include "clang/AST/TypeNodes.def"
54  };
55}
56
57QualType
58TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T,
59                                                 unsigned Quals) const {
60  // FIXME: Implement this
61  assert(false && "Cannot instantiate ExtQualType yet");
62  return QualType();
63}
64
65QualType
66TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T,
67                                                 unsigned Quals) const {
68  assert(false && "Builtin types are not dependent and cannot be instantiated");
69  return QualType(T, Quals);
70}
71
72QualType
73TemplateTypeInstantiator::
74InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const {
75  // FIXME: Implement this
76  assert(false && "Cannot instantiate FixedWidthIntType yet");
77  return QualType();
78}
79
80QualType
81TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T,
82                                                 unsigned Quals) const {
83  // FIXME: Implement this
84  assert(false && "Cannot instantiate ComplexType yet");
85  return QualType();
86}
87
88QualType
89TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T,
90                                                 unsigned Quals) const {
91  QualType PointeeType = Instantiate(T->getPointeeType());
92  if (PointeeType.isNull())
93    return QualType();
94
95  return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity);
96}
97
98QualType
99TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T,
100                                                      unsigned Quals) const {
101  // FIXME: Implement this
102  assert(false && "Cannot instantiate BlockPointerType yet");
103  return QualType();
104}
105
106QualType
107TemplateTypeInstantiator::InstantiateReferenceType(const ReferenceType *T,
108                                                   unsigned Quals) const {
109  QualType ReferentType = Instantiate(T->getPointeeType());
110  if (ReferentType.isNull())
111    return QualType();
112
113  return SemaRef.BuildReferenceType(ReferentType, Quals, Loc, Entity);
114}
115
116QualType
117TemplateTypeInstantiator::
118InstantiateMemberPointerType(const MemberPointerType *T,
119                             unsigned Quals) const {
120  // FIXME: Implement this
121  assert(false && "Cannot instantiate MemberPointerType yet");
122  return QualType();
123}
124
125QualType
126TemplateTypeInstantiator::
127InstantiateConstantArrayType(const ConstantArrayType *T,
128                             unsigned Quals) const {
129  QualType ElementType = Instantiate(T->getElementType());
130  if (ElementType.isNull())
131    return ElementType;
132
133  // Build a temporary integer literal to specify the size for
134  // BuildArrayType. Since we have already checked the size as part of
135  // creating the dependent array type in the first place, we know
136  // there aren't any errors.
137  // FIXME: Is IntTy big enough? Maybe not, but LongLongTy causes
138  // problems that I have yet to investigate.
139  IntegerLiteral ArraySize(T->getSize(), SemaRef.Context.IntTy, Loc);
140  return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
141                                &ArraySize, T->getIndexTypeQualifier(),
142                                Loc, Entity);
143}
144
145QualType
146TemplateTypeInstantiator::
147InstantiateIncompleteArrayType(const IncompleteArrayType *T,
148                               unsigned Quals) const {
149  QualType ElementType = Instantiate(T->getElementType());
150  if (ElementType.isNull())
151    return ElementType;
152
153  return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
154                                0, T->getIndexTypeQualifier(),
155                                Loc, Entity);
156}
157
158QualType
159TemplateTypeInstantiator::
160InstantiateVariableArrayType(const VariableArrayType *T,
161                             unsigned Quals) const {
162  // FIXME: Implement this
163  assert(false && "Cannot instantiate VariableArrayType yet");
164  return QualType();
165}
166
167QualType
168TemplateTypeInstantiator::
169InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,
170                                   unsigned Quals) const {
171  // FIXME: Implement this
172  assert(false && "Cannot instantiate DependentSizedArrayType yet");
173  return QualType();
174}
175
176QualType
177TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T,
178                                             unsigned Quals) const {
179  // FIXME: Implement this
180  assert(false && "Cannot instantiate VectorType yet");
181  return QualType();
182}
183
184QualType
185TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T,
186                                                   unsigned Quals) const {
187  // FIXME: Implement this
188  assert(false && "Cannot instantiate ExtVectorType yet");
189  return QualType();
190}
191
192QualType
193TemplateTypeInstantiator::
194InstantiateFunctionProtoType(const FunctionProtoType *T,
195                             unsigned Quals) const {
196  QualType ResultType = Instantiate(T->getResultType());
197  if (ResultType.isNull())
198    return ResultType;
199
200  llvm::SmallVector<QualType, 16> ParamTypes;
201  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
202                                         ParamEnd = T->arg_type_end();
203       Param != ParamEnd; ++Param) {
204    QualType P = Instantiate(*Param);
205    if (P.isNull())
206      return P;
207
208    ParamTypes.push_back(P);
209  }
210
211  return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0],
212                                   ParamTypes.size(),
213                                   T->isVariadic(), T->getTypeQuals(),
214                                   Loc, Entity);
215}
216
217QualType
218TemplateTypeInstantiator::
219InstantiateFunctionNoProtoType(const FunctionNoProtoType *T,
220                               unsigned Quals) const {
221  assert(false && "Functions without prototypes cannot be dependent.");
222  return QualType();
223}
224
225QualType
226TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T,
227                                                 unsigned Quals) const {
228  // FIXME: Implement this
229  assert(false && "Cannot instantiate TypedefType yet");
230  return QualType();
231}
232
233QualType
234TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T,
235                                                    unsigned Quals) const {
236  // FIXME: Implement this
237  assert(false && "Cannot instantiate TypeOfExprType yet");
238  return QualType();
239}
240
241QualType
242TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T,
243                                                unsigned Quals) const {
244  // FIXME: Implement this
245  assert(false && "Cannot instantiate TypeOfType yet");
246  return QualType();
247}
248
249QualType
250TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T,
251                                                unsigned Quals) const {
252  // FIXME: Implement this
253  assert(false && "Cannot instantiate RecordType yet");
254  return QualType();
255}
256
257QualType
258TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T,
259                                              unsigned Quals) const {
260  // FIXME: Implement this
261  assert(false && "Cannot instantiate EnumType yet");
262  return QualType();
263}
264
265QualType
266TemplateTypeInstantiator::
267InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,
268                                unsigned Quals) const {
269  if (T->getDepth() == 0) {
270    // Replace the template type parameter with its corresponding
271    // template argument.
272    assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args");
273    assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
274           "Template argument kind mismatch");
275    QualType Result = TemplateArgs[T->getIndex()].getAsType();
276    if (Result.isNull() || !Quals)
277      return Result;
278
279    // C++ [dcl.ref]p1:
280    //   [...] Cv-qualified references are ill-formed except when
281    //   the cv-qualifiers are introduced through the use of a
282    //   typedef (7.1.3) or of a template type argument (14.3), in
283    //   which case the cv-qualifiers are ignored.
284    if (Quals && Result->isReferenceType())
285      Quals = 0;
286
287    return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers());
288  }
289
290  // The template type parameter comes from an inner template (e.g.,
291  // the template parameter list of a member template inside the
292  // template we are instantiating). Create a new template type
293  // parameter with the template "level" reduced by one.
294  return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
295                                                 T->getIndex(),
296                                                 T->getName())
297    .getQualifiedType(Quals);
298}
299
300QualType
301TemplateTypeInstantiator::
302InstantiateClassTemplateSpecializationType(
303                                  const ClassTemplateSpecializationType *T,
304                                  unsigned Quals) const {
305  // FIXME: Implement this
306  assert(false && "Cannot instantiate ClassTemplateSpecializationType yet");
307  return QualType();
308}
309
310QualType
311TemplateTypeInstantiator::
312InstantiateObjCInterfaceType(const ObjCInterfaceType *T,
313                             unsigned Quals) const {
314  assert(false && "Objective-C types cannot be dependent");
315  return QualType();
316}
317
318QualType
319TemplateTypeInstantiator::
320InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T,
321                                      unsigned Quals) const {
322  assert(false && "Objective-C types cannot be dependent");
323  return QualType();
324}
325
326QualType
327TemplateTypeInstantiator::
328InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T,
329                               unsigned Quals) const {
330  assert(false && "Objective-C types cannot be dependent");
331  return QualType();
332}
333
334QualType
335TemplateTypeInstantiator::
336InstantiateObjCQualifiedClassType(const ObjCQualifiedClassType *T,
337                                  unsigned Quals) const {
338  assert(false && "Objective-C types cannot be dependent");
339  return QualType();
340}
341
342/// \brief The actual implementation of Sema::InstantiateType().
343QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
344  // If T is not a dependent type, there is nothing to do.
345  if (!T->isDependentType())
346    return T;
347
348  switch (T->getTypeClass()) {
349#define TYPE(Class, Base)                                               \
350  case Type::Class:                                                     \
351    return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()),  \
352                                    T.getCVRQualifiers());
353#define ABSTRACT_TYPE(Class, Base)
354#include "clang/AST/TypeNodes.def"
355  }
356
357  assert(false && "Not all types have been decoded for instantiation");
358  return QualType();
359}
360
361/// \brief Instantiate the type T with a given set of template arguments.
362///
363/// This routine substitutes the given template arguments into the
364/// type T and produces the instantiated type.
365///
366/// \param T the type into which the template arguments will be
367/// substituted. If this type is not dependent, it will be returned
368/// immediately.
369///
370/// \param TemplateArgs the template arguments that will be
371/// substituted for the top-level template parameters within T.
372///
373/// \param NumTemplateArgs the number of template arguments provided
374/// by TemplateArgs.
375///
376/// \param Loc the location in the source code where this substitution
377/// is being performed. It will typically be the location of the
378/// declarator (if we're instantiating the type of some declaration)
379/// or the location of the type in the source code (if, e.g., we're
380/// instantiating the type of a cast expression).
381///
382/// \param Entity the name of the entity associated with a declaration
383/// being instantiated (if any). May be empty to indicate that there
384/// is no such entity (if, e.g., this is a type that occurs as part of
385/// a cast expression) or that the entity has no name (e.g., an
386/// unnamed function parameter).
387///
388/// \returns If the instantiation succeeds, the instantiated
389/// type. Otherwise, produces diagnostics and returns a NULL type.
390QualType Sema::InstantiateType(QualType T,
391                               const TemplateArgument *TemplateArgs,
392                               unsigned NumTemplateArgs,
393                               SourceLocation Loc, DeclarationName Entity) {
394  // If T is not a dependent type, there is nothing to do.
395  if (!T->isDependentType())
396    return T;
397
398  TemplateTypeInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs,
399                                        Loc, Entity);
400  return Instantiator(T);
401}
402
403/// \brief Instantiate the base class specifiers of the given class
404/// template specialization.
405///
406/// Produces a diagnostic and returns true on error, returns false and
407/// attaches the instantiated base classes to the class template
408/// specialization if successful.
409bool
410Sema::InstantiateBaseSpecifiers(
411                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
412                           ClassTemplateDecl *ClassTemplate) {
413  bool Invalid = false;
414  llvm::SmallVector<CXXBaseSpecifier*, 8> InstantiatedBases;
415  for (ClassTemplateSpecializationDecl::base_class_iterator
416         Base = ClassTemplate->getTemplatedDecl()->bases_begin(),
417         BaseEnd = ClassTemplate->getTemplatedDecl()->bases_end();
418       Base != BaseEnd && !Invalid; ++Base) {
419    if (!Base->getType()->isDependentType()) {
420      // FIXME: Allocate via ASTContext
421      InstantiatedBases.push_back(new CXXBaseSpecifier(*Base));
422      continue;
423    }
424
425    QualType BaseType = InstantiateType(Base->getType(),
426                                        ClassTemplateSpec->getTemplateArgs(),
427                                        ClassTemplateSpec->getNumTemplateArgs(),
428                                        Base->getSourceRange().getBegin(),
429                                        DeclarationName());
430    if (BaseType.isNull()) {
431      Invalid = true;
432      continue;
433    }
434
435    if (CXXBaseSpecifier *InstantiatedBase
436          = CheckBaseSpecifier(ClassTemplateSpec,
437                               Base->getSourceRange(),
438                               Base->isVirtual(),
439                               Base->getAccessSpecifierAsWritten(),
440                               BaseType,
441                               /*FIXME: Not totally accurate */
442                               Base->getSourceRange().getBegin()))
443      InstantiatedBases.push_back(InstantiatedBase);
444    else
445      Invalid = true;
446  }
447
448  if (AttachBaseSpecifiers(ClassTemplateSpec, &InstantiatedBases[0],
449                           InstantiatedBases.size()))
450    Invalid = true;
451
452  return Invalid;
453}
454
455bool
456Sema::InstantiateClassTemplateSpecialization(
457                           ClassTemplateSpecializationDecl *ClassTemplateSpec,
458                           bool ExplicitInstantiation) {
459  // Perform the actual instantiation on the canonical declaration.
460  ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
461                               Context.getCanonicalDecl(ClassTemplateSpec));
462
463  // We can only instantiate something that hasn't already been
464  // instantiated or specialized. Fail without any diagnostics: our
465  // caller will provide an error message.
466  if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
467    return true;
468
469  // FIXME: Push this class template instantiation onto the
470  // instantiation stack, checking for recursion that exceeds a
471  // certain depth.
472
473  // FIXME: Perform class template partial specialization to select
474  // the best template.
475  ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
476
477  if (!Template->getTemplatedDecl()->getDefinition(Context)) {
478    Diag(ClassTemplateSpec->getLocation(),
479         diag::err_template_implicit_instantiate_undefined)
480      << Context.getTypeDeclType(ClassTemplateSpec);
481    Diag(Template->getTemplatedDecl()->getLocation(),
482         diag::note_template_decl_here);
483    return true;
484  }
485
486  // Note that this is an instantiation.
487  ClassTemplateSpec->setSpecializationKind(
488                        ExplicitInstantiation? TSK_ExplicitInstantiation
489                                             : TSK_ImplicitInstantiation);
490
491
492  bool Invalid = false;
493
494  // Enter the scope of this instantiation. We don't use
495  // PushDeclContext because we don't have a scope.
496  DeclContext *PreviousContext = CurContext;
497  CurContext = ClassTemplateSpec;
498
499  // Start the definition of this instantiation.
500  ClassTemplateSpec->startDefinition();
501
502  // FIXME: Create the injected-class-name for the
503  // instantiation. Should this be a typedef or something like it?
504
505  // Instantiate the base class specifiers.
506  if (InstantiateBaseSpecifiers(ClassTemplateSpec, Template))
507    Invalid = true;
508
509  // FIXME: Instantiate all of the members.
510
511  // Add any implicitly-declared members that we might need.
512  AddImplicitlyDeclaredMembersToClass(ClassTemplateSpec);
513
514  // Finish the definition of this instantiation.
515  // FIXME: ActOnFields does more checking, which we'll eventually need.
516  ClassTemplateSpec->completeDefinition(Context);
517
518  // Exit the scope of this instantiation.
519  CurContext = PreviousContext;
520
521  return Invalid;
522}
523