blob: 4b98d30b47b9075366d29efb6d5410c6f50ef123 [file] [log] [blame]
Douglas Gregor99ebf652009-02-27 19:31:52 +00001//===------- 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"
Douglas Gregor313a81d2009-03-12 18:36:18 +000018#include "clang/AST/StmtVisitor.h"
Douglas Gregor99ebf652009-02-27 19:31:52 +000019#include "clang/Parse/DeclSpec.h"
20#include "clang/Basic/LangOptions.h"
Douglas Gregorcd281c32009-02-28 00:25:32 +000021#include "llvm/Support/Compiler.h"
Douglas Gregor99ebf652009-02-27 19:31:52 +000022
23using namespace clang;
24
Douglas Gregoree1828a2009-03-10 18:03:33 +000025//===----------------------------------------------------------------------===/
26// Template Instantiation Support
27//===----------------------------------------------------------------------===/
28
Douglas Gregor26dce442009-03-10 00:06:19 +000029Sema::InstantiatingTemplate::
30InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
31 ClassTemplateSpecializationDecl *Entity,
32 SourceRange InstantiationRange)
33 : SemaRef(SemaRef) {
Douglas Gregordf667e72009-03-10 20:44:00 +000034
35 Invalid = CheckInstantiationDepth(PointOfInstantiation,
36 InstantiationRange);
37 if (!Invalid) {
Douglas Gregor26dce442009-03-10 00:06:19 +000038 ActiveTemplateInstantiation Inst;
Douglas Gregordf667e72009-03-10 20:44:00 +000039 Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation;
Douglas Gregor26dce442009-03-10 00:06:19 +000040 Inst.PointOfInstantiation = PointOfInstantiation;
Douglas Gregordf667e72009-03-10 20:44:00 +000041 Inst.Entity = reinterpret_cast<uintptr_t>(Entity);
Douglas Gregor313a81d2009-03-12 18:36:18 +000042 Inst.TemplateArgs = 0;
43 Inst.NumTemplateArgs = 0;
Douglas Gregordf667e72009-03-10 20:44:00 +000044 Inst.InstantiationRange = InstantiationRange;
45 SemaRef.ActiveTemplateInstantiations.push_back(Inst);
46 Invalid = false;
47 }
48}
49
50Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
51 SourceLocation PointOfInstantiation,
52 TemplateDecl *Template,
53 const TemplateArgument *TemplateArgs,
54 unsigned NumTemplateArgs,
55 SourceRange InstantiationRange)
56 : SemaRef(SemaRef) {
57
58 Invalid = CheckInstantiationDepth(PointOfInstantiation,
59 InstantiationRange);
60 if (!Invalid) {
61 ActiveTemplateInstantiation Inst;
62 Inst.Kind
63 = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation;
64 Inst.PointOfInstantiation = PointOfInstantiation;
65 Inst.Entity = reinterpret_cast<uintptr_t>(Template);
66 Inst.TemplateArgs = TemplateArgs;
67 Inst.NumTemplateArgs = NumTemplateArgs;
Douglas Gregor26dce442009-03-10 00:06:19 +000068 Inst.InstantiationRange = InstantiationRange;
69 SemaRef.ActiveTemplateInstantiations.push_back(Inst);
70 Invalid = false;
71 }
72}
73
74Sema::InstantiatingTemplate::~InstantiatingTemplate() {
75 if (!Invalid)
76 SemaRef.ActiveTemplateInstantiations.pop_back();
77}
78
Douglas Gregordf667e72009-03-10 20:44:00 +000079bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
80 SourceLocation PointOfInstantiation,
81 SourceRange InstantiationRange) {
82 if (SemaRef.ActiveTemplateInstantiations.size()
83 <= SemaRef.getLangOptions().InstantiationDepth)
84 return false;
85
86 SemaRef.Diag(PointOfInstantiation,
87 diag::err_template_recursion_depth_exceeded)
88 << SemaRef.getLangOptions().InstantiationDepth
89 << InstantiationRange;
90 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
91 << SemaRef.getLangOptions().InstantiationDepth;
92 return true;
93}
94
Douglas Gregoree1828a2009-03-10 18:03:33 +000095/// \brief Post-diagnostic hook for printing the instantiation stack.
96void Sema::PrintInstantiationStackHook(unsigned, void *Cookie) {
Douglas Gregor27b152f2009-03-10 18:52:44 +000097 Sema &SemaRef = *static_cast<Sema*>(Cookie);
98 SemaRef.PrintInstantiationStack();
99 SemaRef.LastTemplateInstantiationErrorContext
Douglas Gregordf667e72009-03-10 20:44:00 +0000100 = SemaRef.ActiveTemplateInstantiations.back();
Douglas Gregoree1828a2009-03-10 18:03:33 +0000101}
102
103/// \brief Prints the current instantiation stack through a series of
104/// notes.
105void Sema::PrintInstantiationStack() {
106 for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
107 Active = ActiveTemplateInstantiations.rbegin(),
108 ActiveEnd = ActiveTemplateInstantiations.rend();
109 Active != ActiveEnd;
110 ++Active) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000111 switch (Active->Kind) {
112 case ActiveTemplateInstantiation::TemplateInstantiation: {
113 ClassTemplateSpecializationDecl *Spec
114 = cast<ClassTemplateSpecializationDecl>((Decl*)Active->Entity);
115 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
116 diag::note_template_class_instantiation_here)
117 << Context.getTypeDeclType(Spec)
118 << Active->InstantiationRange;
119 break;
120 }
121
122 case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
123 TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity);
124 std::string TemplateArgsStr
125 = ClassTemplateSpecializationType::PrintTemplateArgumentList(
126 Active->TemplateArgs,
127 Active->NumTemplateArgs);
128 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
129 diag::note_default_arg_instantiation_here)
130 << (Template->getNameAsString() + TemplateArgsStr)
131 << Active->InstantiationRange;
132 break;
133 }
134 }
Douglas Gregoree1828a2009-03-10 18:03:33 +0000135 }
136}
137
Douglas Gregor99ebf652009-02-27 19:31:52 +0000138//===----------------------------------------------------------------------===/
139// Template Instantiation for Types
140//===----------------------------------------------------------------------===/
Douglas Gregorcd281c32009-02-28 00:25:32 +0000141namespace {
142 class VISIBILITY_HIDDEN TemplateTypeInstantiator {
143 Sema &SemaRef;
144 const TemplateArgument *TemplateArgs;
145 unsigned NumTemplateArgs;
146 SourceLocation Loc;
147 DeclarationName Entity;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000148
Douglas Gregorcd281c32009-02-28 00:25:32 +0000149 public:
150 TemplateTypeInstantiator(Sema &SemaRef,
151 const TemplateArgument *TemplateArgs,
152 unsigned NumTemplateArgs,
153 SourceLocation Loc,
154 DeclarationName Entity)
155 : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
156 NumTemplateArgs(NumTemplateArgs), Loc(Loc), Entity(Entity) { }
157
158 QualType operator()(QualType T) const { return Instantiate(T); }
159
160 QualType Instantiate(QualType T) const;
161
162 // Declare instantiate functions for each type.
163#define TYPE(Class, Base) \
164 QualType Instantiate##Class##Type(const Class##Type *T, \
165 unsigned Quals) const;
166#define ABSTRACT_TYPE(Class, Base)
167#include "clang/AST/TypeNodes.def"
168 };
169}
170
171QualType
172TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T,
173 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000174 // FIXME: Implement this
175 assert(false && "Cannot instantiate ExtQualType yet");
176 return QualType();
177}
178
Douglas Gregorcd281c32009-02-28 00:25:32 +0000179QualType
180TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T,
181 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000182 assert(false && "Builtin types are not dependent and cannot be instantiated");
Douglas Gregorcd281c32009-02-28 00:25:32 +0000183 return QualType(T, Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000184}
185
Douglas Gregorcd281c32009-02-28 00:25:32 +0000186QualType
187TemplateTypeInstantiator::
188InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000189 // FIXME: Implement this
190 assert(false && "Cannot instantiate FixedWidthIntType yet");
191 return QualType();
192}
193
Douglas Gregorcd281c32009-02-28 00:25:32 +0000194QualType
195TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T,
196 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000197 // FIXME: Implement this
198 assert(false && "Cannot instantiate ComplexType yet");
199 return QualType();
200}
201
Douglas Gregorcd281c32009-02-28 00:25:32 +0000202QualType
203TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T,
204 unsigned Quals) const {
205 QualType PointeeType = Instantiate(T->getPointeeType());
206 if (PointeeType.isNull())
207 return QualType();
208
209 return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000210}
211
Douglas Gregorcd281c32009-02-28 00:25:32 +0000212QualType
213TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T,
214 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000215 // FIXME: Implement this
216 assert(false && "Cannot instantiate BlockPointerType yet");
217 return QualType();
218}
219
Douglas Gregorcd281c32009-02-28 00:25:32 +0000220QualType
221TemplateTypeInstantiator::InstantiateReferenceType(const ReferenceType *T,
222 unsigned Quals) const {
223 QualType ReferentType = Instantiate(T->getPointeeType());
224 if (ReferentType.isNull())
225 return QualType();
226
227 return SemaRef.BuildReferenceType(ReferentType, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000228}
229
Douglas Gregorcd281c32009-02-28 00:25:32 +0000230QualType
231TemplateTypeInstantiator::
232InstantiateMemberPointerType(const MemberPointerType *T,
233 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000234 // FIXME: Implement this
235 assert(false && "Cannot instantiate MemberPointerType yet");
236 return QualType();
237}
238
Douglas Gregorcd281c32009-02-28 00:25:32 +0000239QualType
240TemplateTypeInstantiator::
241InstantiateConstantArrayType(const ConstantArrayType *T,
242 unsigned Quals) const {
243 QualType ElementType = Instantiate(T->getElementType());
244 if (ElementType.isNull())
245 return ElementType;
246
247 // Build a temporary integer literal to specify the size for
248 // BuildArrayType. Since we have already checked the size as part of
249 // creating the dependent array type in the first place, we know
250 // there aren't any errors.
Douglas Gregor8d217212009-03-09 20:07:22 +0000251 // FIXME: Is IntTy big enough? Maybe not, but LongLongTy causes
252 // problems that I have yet to investigate.
253 IntegerLiteral ArraySize(T->getSize(), SemaRef.Context.IntTy, Loc);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000254 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
255 &ArraySize, T->getIndexTypeQualifier(),
256 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000257}
258
Douglas Gregorcd281c32009-02-28 00:25:32 +0000259QualType
260TemplateTypeInstantiator::
261InstantiateIncompleteArrayType(const IncompleteArrayType *T,
262 unsigned Quals) const {
263 QualType ElementType = Instantiate(T->getElementType());
264 if (ElementType.isNull())
265 return ElementType;
266
267 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
268 0, T->getIndexTypeQualifier(),
269 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000270}
271
Douglas Gregorcd281c32009-02-28 00:25:32 +0000272QualType
273TemplateTypeInstantiator::
274InstantiateVariableArrayType(const VariableArrayType *T,
275 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000276 // FIXME: Implement this
277 assert(false && "Cannot instantiate VariableArrayType yet");
278 return QualType();
279}
280
Douglas Gregorcd281c32009-02-28 00:25:32 +0000281QualType
282TemplateTypeInstantiator::
283InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,
284 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000285 // FIXME: Implement this
286 assert(false && "Cannot instantiate DependentSizedArrayType yet");
287 return QualType();
288}
289
Douglas Gregorcd281c32009-02-28 00:25:32 +0000290QualType
291TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T,
292 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000293 // FIXME: Implement this
294 assert(false && "Cannot instantiate VectorType yet");
295 return QualType();
296}
297
Douglas Gregorcd281c32009-02-28 00:25:32 +0000298QualType
299TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T,
300 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000301 // FIXME: Implement this
302 assert(false && "Cannot instantiate ExtVectorType yet");
303 return QualType();
304}
305
Douglas Gregorcd281c32009-02-28 00:25:32 +0000306QualType
307TemplateTypeInstantiator::
308InstantiateFunctionProtoType(const FunctionProtoType *T,
309 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000310 QualType ResultType = Instantiate(T->getResultType());
311 if (ResultType.isNull())
312 return ResultType;
313
314 llvm::SmallVector<QualType, 16> ParamTypes;
315 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
316 ParamEnd = T->arg_type_end();
317 Param != ParamEnd; ++Param) {
318 QualType P = Instantiate(*Param);
319 if (P.isNull())
320 return P;
321
322 ParamTypes.push_back(P);
323 }
324
325 return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0],
326 ParamTypes.size(),
327 T->isVariadic(), T->getTypeQuals(),
328 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000329}
330
Douglas Gregorcd281c32009-02-28 00:25:32 +0000331QualType
332TemplateTypeInstantiator::
333InstantiateFunctionNoProtoType(const FunctionNoProtoType *T,
334 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000335 assert(false && "Functions without prototypes cannot be dependent.");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000336 return QualType();
337}
338
Douglas Gregorcd281c32009-02-28 00:25:32 +0000339QualType
340TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T,
341 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000342 // FIXME: Implement this
343 assert(false && "Cannot instantiate TypedefType yet");
344 return QualType();
345}
346
Douglas Gregorcd281c32009-02-28 00:25:32 +0000347QualType
348TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T,
349 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000350 // FIXME: Implement this
351 assert(false && "Cannot instantiate TypeOfExprType yet");
352 return QualType();
353}
354
Douglas Gregorcd281c32009-02-28 00:25:32 +0000355QualType
356TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T,
357 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000358 // FIXME: Implement this
359 assert(false && "Cannot instantiate TypeOfType yet");
360 return QualType();
361}
362
Douglas Gregorcd281c32009-02-28 00:25:32 +0000363QualType
364TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T,
365 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000366 // FIXME: Implement this
367 assert(false && "Cannot instantiate RecordType yet");
368 return QualType();
369}
370
Douglas Gregorcd281c32009-02-28 00:25:32 +0000371QualType
Douglas Gregorcd281c32009-02-28 00:25:32 +0000372TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T,
373 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000374 // FIXME: Implement this
375 assert(false && "Cannot instantiate EnumType yet");
376 return QualType();
377}
378
Douglas Gregorcd281c32009-02-28 00:25:32 +0000379QualType
380TemplateTypeInstantiator::
381InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,
382 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000383 if (T->getDepth() == 0) {
384 // Replace the template type parameter with its corresponding
385 // template argument.
386 assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args");
387 assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
388 "Template argument kind mismatch");
389 QualType Result = TemplateArgs[T->getIndex()].getAsType();
Douglas Gregorcd281c32009-02-28 00:25:32 +0000390 if (Result.isNull() || !Quals)
Douglas Gregor99ebf652009-02-27 19:31:52 +0000391 return Result;
392
393 // C++ [dcl.ref]p1:
394 // [...] Cv-qualified references are ill-formed except when
395 // the cv-qualifiers are introduced through the use of a
396 // typedef (7.1.3) or of a template type argument (14.3), in
397 // which case the cv-qualifiers are ignored.
Douglas Gregorcd281c32009-02-28 00:25:32 +0000398 if (Quals && Result->isReferenceType())
399 Quals = 0;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000400
Douglas Gregorcd281c32009-02-28 00:25:32 +0000401 return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000402 }
403
404 // The template type parameter comes from an inner template (e.g.,
405 // the template parameter list of a member template inside the
406 // template we are instantiating). Create a new template type
407 // parameter with the template "level" reduced by one.
408 return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
409 T->getIndex(),
Douglas Gregorcd281c32009-02-28 00:25:32 +0000410 T->getName())
411 .getQualifiedType(Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000412}
413
Douglas Gregorcd281c32009-02-28 00:25:32 +0000414QualType
415TemplateTypeInstantiator::
416InstantiateClassTemplateSpecializationType(
417 const ClassTemplateSpecializationType *T,
418 unsigned Quals) const {
Douglas Gregor40808ce2009-03-09 23:48:35 +0000419 llvm::SmallVector<TemplateArgument, 16> InstantiatedTemplateArgs;
420 InstantiatedTemplateArgs.reserve(T->getNumArgs());
421 for (ClassTemplateSpecializationType::iterator Arg = T->begin(),
422 ArgEnd = T->end();
423 Arg != ArgEnd; ++Arg) {
424 switch (Arg->getKind()) {
425 case TemplateArgument::Type: {
426 QualType T = SemaRef.InstantiateType(Arg->getAsType(),
427 TemplateArgs, NumTemplateArgs,
428 Arg->getLocation(),
429 DeclarationName());
430 if (T.isNull())
431 return QualType();
432
433 InstantiatedTemplateArgs.push_back(
434 TemplateArgument(Arg->getLocation(), T));
435 break;
436 }
437
438 case TemplateArgument::Declaration:
439 case TemplateArgument::Integral:
440 InstantiatedTemplateArgs.push_back(*Arg);
441 break;
442
443 case TemplateArgument::Expression:
444 assert(false && "Cannot instantiate expressions yet");
445 break;
446 }
447 }
448
449 // FIXME: We're missing the locations of the template name, '<', and
450 // '>'.
451 return SemaRef.CheckClassTemplateId(cast<ClassTemplateDecl>(T->getTemplate()),
452 Loc,
453 SourceLocation(),
454 &InstantiatedTemplateArgs[0],
455 InstantiatedTemplateArgs.size(),
456 SourceLocation());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000457}
458
Douglas Gregorcd281c32009-02-28 00:25:32 +0000459QualType
460TemplateTypeInstantiator::
461InstantiateObjCInterfaceType(const ObjCInterfaceType *T,
462 unsigned Quals) const {
463 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000464 return QualType();
465}
466
Douglas Gregorcd281c32009-02-28 00:25:32 +0000467QualType
468TemplateTypeInstantiator::
469InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T,
470 unsigned Quals) const {
471 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000472 return QualType();
473}
474
Douglas Gregorcd281c32009-02-28 00:25:32 +0000475QualType
476TemplateTypeInstantiator::
477InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T,
478 unsigned Quals) const {
479 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000480 return QualType();
481}
482
Douglas Gregorcd281c32009-02-28 00:25:32 +0000483QualType
484TemplateTypeInstantiator::
485InstantiateObjCQualifiedClassType(const ObjCQualifiedClassType *T,
486 unsigned Quals) const {
487 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000488 return QualType();
489}
490
Douglas Gregorcd281c32009-02-28 00:25:32 +0000491/// \brief The actual implementation of Sema::InstantiateType().
492QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
493 // If T is not a dependent type, there is nothing to do.
494 if (!T->isDependentType())
495 return T;
496
497 switch (T->getTypeClass()) {
498#define TYPE(Class, Base) \
499 case Type::Class: \
500 return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()), \
501 T.getCVRQualifiers());
502#define ABSTRACT_TYPE(Class, Base)
503#include "clang/AST/TypeNodes.def"
504 }
505
506 assert(false && "Not all types have been decoded for instantiation");
507 return QualType();
508}
Douglas Gregor99ebf652009-02-27 19:31:52 +0000509
510/// \brief Instantiate the type T with a given set of template arguments.
511///
512/// This routine substitutes the given template arguments into the
513/// type T and produces the instantiated type.
514///
515/// \param T the type into which the template arguments will be
516/// substituted. If this type is not dependent, it will be returned
517/// immediately.
518///
519/// \param TemplateArgs the template arguments that will be
520/// substituted for the top-level template parameters within T.
521///
522/// \param NumTemplateArgs the number of template arguments provided
523/// by TemplateArgs.
524///
525/// \param Loc the location in the source code where this substitution
526/// is being performed. It will typically be the location of the
527/// declarator (if we're instantiating the type of some declaration)
528/// or the location of the type in the source code (if, e.g., we're
529/// instantiating the type of a cast expression).
530///
531/// \param Entity the name of the entity associated with a declaration
532/// being instantiated (if any). May be empty to indicate that there
533/// is no such entity (if, e.g., this is a type that occurs as part of
534/// a cast expression) or that the entity has no name (e.g., an
535/// unnamed function parameter).
536///
537/// \returns If the instantiation succeeds, the instantiated
538/// type. Otherwise, produces diagnostics and returns a NULL type.
539QualType Sema::InstantiateType(QualType T,
540 const TemplateArgument *TemplateArgs,
541 unsigned NumTemplateArgs,
542 SourceLocation Loc, DeclarationName Entity) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000543 assert(!ActiveTemplateInstantiations.empty() &&
544 "Cannot perform an instantiation without some context on the "
545 "instantiation stack");
546
Douglas Gregor99ebf652009-02-27 19:31:52 +0000547 // If T is not a dependent type, there is nothing to do.
548 if (!T->isDependentType())
549 return T;
550
Douglas Gregorcd281c32009-02-28 00:25:32 +0000551 TemplateTypeInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs,
552 Loc, Entity);
553 return Instantiator(T);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000554}
Douglas Gregor2943aed2009-03-03 04:44:36 +0000555
Douglas Gregora0e500d2009-03-12 16:53:44 +0000556//===----------------------------------------------------------------------===/
557// Template Instantiation for Expressions
558//===----------------------------------------------------------------------===/
Douglas Gregor313a81d2009-03-12 18:36:18 +0000559namespace {
560 class VISIBILITY_HIDDEN TemplateExprInstantiator
561 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
562 Sema &SemaRef;
563 const TemplateArgument *TemplateArgs;
564 unsigned NumTemplateArgs;
565
566 public:
567 TemplateExprInstantiator(Sema &SemaRef,
568 const TemplateArgument *TemplateArgs,
569 unsigned NumTemplateArgs)
570 : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
571 NumTemplateArgs(NumTemplateArgs) { }
572
573 // FIXME: Once we get closer to completion, replace these
574 // manually-written declarations with automatically-generated ones
575 // from clang/AST/StmtNodes.def.
576 Sema::OwningExprResult VisitIntegerLiteral(IntegerLiteral *E);
577 Sema::OwningExprResult VisitDeclRefExpr(DeclRefExpr *E);
578 Sema::OwningExprResult VisitParenExpr(ParenExpr *E);
Douglas Gregordf032512009-03-12 22:46:12 +0000579 Sema::OwningExprResult VisitBinaryOperator(BinaryOperator *E);
Douglas Gregor313a81d2009-03-12 18:36:18 +0000580
581 // Base case. I'm supposed to ignore this.
Douglas Gregordf032512009-03-12 22:46:12 +0000582 Sema::OwningExprResult VisitStmt(Stmt *) {
583 assert(false && "Cannot instantiate this kind of expression");
584 return SemaRef.ExprError();
585 }
Douglas Gregor313a81d2009-03-12 18:36:18 +0000586 };
587}
588
589Sema::OwningExprResult
590TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
591 // FIXME: Can't we just re-use the expression node?
592 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(E->getValue(),
593 E->getType(),
594 E->getLocation()));
595}
596
597Sema::OwningExprResult
598TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
599 Decl *D = E->getDecl();
600 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
601 assert(NTTP->getDepth() == 0 && "No nested templates yet");
Douglas Gregorc971f862009-03-12 22:20:26 +0000602 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
Douglas Gregor313a81d2009-03-12 18:36:18 +0000603 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
Douglas Gregorc971f862009-03-12 22:20:26 +0000604 *Arg.getAsIntegral(),
605 Arg.getIntegralType(),
606 E->getSourceRange().getBegin()));
Douglas Gregor313a81d2009-03-12 18:36:18 +0000607 } else
608 assert(false && "Can't handle arbitrary declaration references");
609
610 return SemaRef.ExprError();
611}
612
613Sema::OwningExprResult
614TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
615 Sema::OwningExprResult SubExpr
616 = SemaRef.InstantiateExpr(E->getSubExpr(), TemplateArgs, NumTemplateArgs);
617 if (SubExpr.isInvalid())
618 return SemaRef.ExprError();
619
620 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
621 E->getLParen(), E->getRParen(),
622 (Expr *)SubExpr.release()));
623}
624
Douglas Gregora0e500d2009-03-12 16:53:44 +0000625Sema::OwningExprResult
Douglas Gregordf032512009-03-12 22:46:12 +0000626TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
627 Sema::OwningExprResult LHS = Visit(E->getLHS());
628 if (LHS.isInvalid())
629 return SemaRef.ExprError();
630
631 Sema::OwningExprResult RHS = Visit(E->getRHS());
632 if (RHS.isInvalid())
633 return SemaRef.ExprError();
634
635 Sema::OwningExprResult Result
636 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
637 E->getOpcode(),
638 (Expr *)LHS.get(),
639 (Expr *)RHS.get());
640 if (Result.isInvalid())
641 return SemaRef.ExprError();
642
643 LHS.release();
644 RHS.release();
645 return move(Result);
646}
647
648Sema::OwningExprResult
Douglas Gregora0e500d2009-03-12 16:53:44 +0000649Sema::InstantiateExpr(Expr *E, const TemplateArgument *TemplateArgs,
650 unsigned NumTemplateArgs) {
Douglas Gregor313a81d2009-03-12 18:36:18 +0000651 TemplateExprInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs);
652 return Instantiator.Visit(E);
Douglas Gregora0e500d2009-03-12 16:53:44 +0000653}
654
Douglas Gregor2943aed2009-03-03 04:44:36 +0000655/// \brief Instantiate the base class specifiers of the given class
656/// template specialization.
657///
658/// Produces a diagnostic and returns true on error, returns false and
659/// attaches the instantiated base classes to the class template
660/// specialization if successful.
661bool
662Sema::InstantiateBaseSpecifiers(
663 ClassTemplateSpecializationDecl *ClassTemplateSpec,
664 ClassTemplateDecl *ClassTemplate) {
665 bool Invalid = false;
666 llvm::SmallVector<CXXBaseSpecifier*, 8> InstantiatedBases;
667 for (ClassTemplateSpecializationDecl::base_class_iterator
668 Base = ClassTemplate->getTemplatedDecl()->bases_begin(),
669 BaseEnd = ClassTemplate->getTemplatedDecl()->bases_end();
Douglas Gregor27b152f2009-03-10 18:52:44 +0000670 Base != BaseEnd; ++Base) {
Douglas Gregor2943aed2009-03-03 04:44:36 +0000671 if (!Base->getType()->isDependentType()) {
672 // FIXME: Allocate via ASTContext
673 InstantiatedBases.push_back(new CXXBaseSpecifier(*Base));
674 continue;
675 }
676
677 QualType BaseType = InstantiateType(Base->getType(),
678 ClassTemplateSpec->getTemplateArgs(),
679 ClassTemplateSpec->getNumTemplateArgs(),
680 Base->getSourceRange().getBegin(),
681 DeclarationName());
682 if (BaseType.isNull()) {
683 Invalid = true;
684 continue;
685 }
686
687 if (CXXBaseSpecifier *InstantiatedBase
688 = CheckBaseSpecifier(ClassTemplateSpec,
689 Base->getSourceRange(),
690 Base->isVirtual(),
691 Base->getAccessSpecifierAsWritten(),
692 BaseType,
693 /*FIXME: Not totally accurate */
694 Base->getSourceRange().getBegin()))
695 InstantiatedBases.push_back(InstantiatedBase);
696 else
697 Invalid = true;
698 }
699
Douglas Gregor27b152f2009-03-10 18:52:44 +0000700 if (!Invalid &&
701 AttachBaseSpecifiers(ClassTemplateSpec, &InstantiatedBases[0],
Douglas Gregor2943aed2009-03-03 04:44:36 +0000702 InstantiatedBases.size()))
703 Invalid = true;
704
705 return Invalid;
706}
707
708bool
709Sema::InstantiateClassTemplateSpecialization(
710 ClassTemplateSpecializationDecl *ClassTemplateSpec,
711 bool ExplicitInstantiation) {
712 // Perform the actual instantiation on the canonical declaration.
713 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
714 Context.getCanonicalDecl(ClassTemplateSpec));
715
716 // We can only instantiate something that hasn't already been
717 // instantiated or specialized. Fail without any diagnostics: our
718 // caller will provide an error message.
719 if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
720 return true;
721
722 // FIXME: Push this class template instantiation onto the
723 // instantiation stack, checking for recursion that exceeds a
724 // certain depth.
725
726 // FIXME: Perform class template partial specialization to select
727 // the best template.
728 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
729
730 if (!Template->getTemplatedDecl()->getDefinition(Context)) {
731 Diag(ClassTemplateSpec->getLocation(),
732 diag::err_template_implicit_instantiate_undefined)
733 << Context.getTypeDeclType(ClassTemplateSpec);
734 Diag(Template->getTemplatedDecl()->getLocation(),
735 diag::note_template_decl_here);
736 return true;
737 }
738
739 // Note that this is an instantiation.
740 ClassTemplateSpec->setSpecializationKind(
741 ExplicitInstantiation? TSK_ExplicitInstantiation
742 : TSK_ImplicitInstantiation);
743
744
745 bool Invalid = false;
746
Douglas Gregor26dce442009-03-10 00:06:19 +0000747 InstantiatingTemplate Inst(*this, ClassTemplateSpec->getLocation(),
748 ClassTemplateSpec);
749 if (Inst)
750 return true;
751
Douglas Gregor2943aed2009-03-03 04:44:36 +0000752 // Enter the scope of this instantiation. We don't use
753 // PushDeclContext because we don't have a scope.
754 DeclContext *PreviousContext = CurContext;
755 CurContext = ClassTemplateSpec;
756
757 // Start the definition of this instantiation.
758 ClassTemplateSpec->startDefinition();
759
Douglas Gregor2943aed2009-03-03 04:44:36 +0000760
761 // Instantiate the base class specifiers.
762 if (InstantiateBaseSpecifiers(ClassTemplateSpec, Template))
763 Invalid = true;
764
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000765 // FIXME: Create the injected-class-name for the
766 // instantiation. Should this be a typedef or something like it?
767
768 RecordDecl *Pattern = Template->getTemplatedDecl();
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000769 llvm::SmallVector<DeclTy *, 32> Fields;
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000770 for (RecordDecl::decl_iterator Member = Pattern->decls_begin(),
771 MemberEnd = Pattern->decls_end();
772 Member != MemberEnd; ++Member) {
773 if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(*Member)) {
774 // FIXME: Simplified instantiation of typedefs needs to be made
775 // "real".
776 QualType T = Typedef->getUnderlyingType();
777 if (T->isDependentType()) {
778 T = InstantiateType(T, ClassTemplateSpec->getTemplateArgs(),
779 ClassTemplateSpec->getNumTemplateArgs(),
780 Typedef->getLocation(),
781 Typedef->getDeclName());
782 if (T.isNull()) {
783 Invalid = true;
784 T = Context.IntTy;
785 }
786 }
787
788 // Create the new typedef
789 TypedefDecl *New
790 = TypedefDecl::Create(Context, ClassTemplateSpec,
791 Typedef->getLocation(),
792 Typedef->getIdentifier(),
793 T);
794 ClassTemplateSpec->addDecl(New);
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000795 }
796 else if (FieldDecl *Field = dyn_cast<FieldDecl>(*Member)) {
797 // FIXME: Simplified instantiation of fields needs to be made
798 // "real".
Douglas Gregora0e500d2009-03-12 16:53:44 +0000799 bool InvalidDecl = false;
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000800 QualType T = Field->getType();
801 if (T->isDependentType()) {
802 T = InstantiateType(T, ClassTemplateSpec->getTemplateArgs(),
803 ClassTemplateSpec->getNumTemplateArgs(),
804 Field->getLocation(),
805 Field->getDeclName());
806 if (!T.isNull() && T->isFunctionType()) {
807 // C++ [temp.arg.type]p3:
808 // If a declaration acquires a function type through a type
809 // dependent on a template-parameter and this causes a
810 // declaration that does not use the syntactic form of a
811 // function declarator to have function type, the program is
812 // ill-formed.
813 Diag(Field->getLocation(), diag::err_field_instantiates_to_function)
814 << T;
815 T = QualType();
Douglas Gregora0e500d2009-03-12 16:53:44 +0000816 InvalidDecl = true;
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000817 }
818 }
819
Douglas Gregora0e500d2009-03-12 16:53:44 +0000820 Expr *BitWidth = Field->getBitWidth();
821 if (InvalidDecl)
822 BitWidth = 0;
823 if (BitWidth &&
824 (BitWidth->isTypeDependent() || BitWidth->isValueDependent())) {
825 OwningExprResult InstantiatedBitWidth
826 = InstantiateExpr(BitWidth,
827 ClassTemplateSpec->getTemplateArgs(),
828 ClassTemplateSpec->getNumTemplateArgs());
829 if (InstantiatedBitWidth.isInvalid()) {
830 Invalid = InvalidDecl = true;
831 BitWidth = 0;
832 } else
833 BitWidth = (Expr *)InstantiatedBitWidth.release();
834 }
835
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000836 FieldDecl *New = CheckFieldDecl(Field->getDeclName(), T,
837 ClassTemplateSpec,
838 Field->getLocation(),
839 Field->isMutable(),
Douglas Gregora0e500d2009-03-12 16:53:44 +0000840 BitWidth,
Douglas Gregor4dd55f52009-03-11 20:50:30 +0000841 Field->getAccess(),
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000842 0);
843 if (New) {
844 ClassTemplateSpec->addDecl(New);
845 Fields.push_back(New);
846
Douglas Gregora0e500d2009-03-12 16:53:44 +0000847 if (InvalidDecl)
848 New->setInvalidDecl();
849
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000850 if (New->isInvalidDecl())
851 Invalid = true;
852 }
Douglas Gregor4fdf1fa2009-03-11 16:48:53 +0000853 }
854 }
855
Douglas Gregor3cf538d2009-03-11 18:59:21 +0000856 // Finish checking fields.
857 ActOnFields(0, ClassTemplateSpec->getLocation(), ClassTemplateSpec,
858 &Fields[0], Fields.size(), SourceLocation(), SourceLocation(),
859 0);
860
Douglas Gregor2943aed2009-03-03 04:44:36 +0000861 // Add any implicitly-declared members that we might need.
862 AddImplicitlyDeclaredMembersToClass(ClassTemplateSpec);
863
Douglas Gregor2943aed2009-03-03 04:44:36 +0000864 // Exit the scope of this instantiation.
865 CurContext = PreviousContext;
866
867 return Invalid;
868}