blob: a7fdb59a2047c7b584a4784466ffb46c93ae6bdd [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"
Douglas Gregoraba43bb2009-05-26 20:50:29 +000014#include "clang/AST/ASTConsumer.h"
Douglas Gregor99ebf652009-02-27 19:31:52 +000015#include "clang/AST/ASTContext.h"
16#include "clang/AST/Expr.h"
Douglas Gregor99ebf652009-02-27 19:31:52 +000017#include "clang/AST/DeclTemplate.h"
18#include "clang/Parse/DeclSpec.h"
19#include "clang/Basic/LangOptions.h"
Douglas Gregorcd281c32009-02-28 00:25:32 +000020#include "llvm/Support/Compiler.h"
Douglas Gregor99ebf652009-02-27 19:31:52 +000021
22using namespace clang;
23
Douglas Gregoree1828a2009-03-10 18:03:33 +000024//===----------------------------------------------------------------------===/
25// Template Instantiation Support
26//===----------------------------------------------------------------------===/
27
Douglas Gregor54dabfc2009-05-14 23:26:13 +000028/// \brief Retrieve the template argument list that should be used to
29/// instantiate the given declaration.
30const TemplateArgumentList &
31Sema::getTemplateInstantiationArgs(NamedDecl *D) {
32 if (ClassTemplateSpecializationDecl *Spec
33 = dyn_cast<ClassTemplateSpecializationDecl>(D))
34 return Spec->getTemplateArgs();
35
36 DeclContext *EnclosingTemplateCtx = D->getDeclContext();
37 while (!isa<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx)) {
38 assert(!EnclosingTemplateCtx->isFileContext() &&
39 "Tried to get the instantiation arguments of a non-template");
40 EnclosingTemplateCtx = EnclosingTemplateCtx->getParent();
41 }
42
43 ClassTemplateSpecializationDecl *EnclosingTemplate
44 = cast<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx);
45 return EnclosingTemplate->getTemplateArgs();
46}
47
Douglas Gregor26dce442009-03-10 00:06:19 +000048Sema::InstantiatingTemplate::
49InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
Douglas Gregorf3e7ce42009-05-18 17:01:57 +000050 Decl *Entity,
Douglas Gregor26dce442009-03-10 00:06:19 +000051 SourceRange InstantiationRange)
52 : SemaRef(SemaRef) {
Douglas Gregordf667e72009-03-10 20:44:00 +000053
54 Invalid = CheckInstantiationDepth(PointOfInstantiation,
55 InstantiationRange);
56 if (!Invalid) {
Douglas Gregor26dce442009-03-10 00:06:19 +000057 ActiveTemplateInstantiation Inst;
Douglas Gregordf667e72009-03-10 20:44:00 +000058 Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation;
Douglas Gregor26dce442009-03-10 00:06:19 +000059 Inst.PointOfInstantiation = PointOfInstantiation;
Douglas Gregordf667e72009-03-10 20:44:00 +000060 Inst.Entity = reinterpret_cast<uintptr_t>(Entity);
Douglas Gregor313a81d2009-03-12 18:36:18 +000061 Inst.TemplateArgs = 0;
62 Inst.NumTemplateArgs = 0;
Douglas Gregordf667e72009-03-10 20:44:00 +000063 Inst.InstantiationRange = InstantiationRange;
64 SemaRef.ActiveTemplateInstantiations.push_back(Inst);
65 Invalid = false;
66 }
67}
68
69Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
70 SourceLocation PointOfInstantiation,
71 TemplateDecl *Template,
72 const TemplateArgument *TemplateArgs,
73 unsigned NumTemplateArgs,
74 SourceRange InstantiationRange)
75 : SemaRef(SemaRef) {
76
77 Invalid = CheckInstantiationDepth(PointOfInstantiation,
78 InstantiationRange);
79 if (!Invalid) {
80 ActiveTemplateInstantiation Inst;
81 Inst.Kind
82 = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation;
83 Inst.PointOfInstantiation = PointOfInstantiation;
84 Inst.Entity = reinterpret_cast<uintptr_t>(Template);
85 Inst.TemplateArgs = TemplateArgs;
86 Inst.NumTemplateArgs = NumTemplateArgs;
Douglas Gregor26dce442009-03-10 00:06:19 +000087 Inst.InstantiationRange = InstantiationRange;
88 SemaRef.ActiveTemplateInstantiations.push_back(Inst);
89 Invalid = false;
90 }
91}
92
Douglas Gregor637a4092009-06-10 23:47:09 +000093Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef,
94 SourceLocation PointOfInstantiation,
95 ClassTemplatePartialSpecializationDecl *PartialSpec,
96 const TemplateArgument *TemplateArgs,
97 unsigned NumTemplateArgs,
98 SourceRange InstantiationRange)
99 : SemaRef(SemaRef) {
100
101 Invalid = CheckInstantiationDepth(PointOfInstantiation,
102 InstantiationRange);
103 if (!Invalid) {
104 ActiveTemplateInstantiation Inst;
105 Inst.Kind
106 = ActiveTemplateInstantiation::PartialSpecDeductionInstantiation;
107 Inst.PointOfInstantiation = PointOfInstantiation;
108 Inst.Entity = reinterpret_cast<uintptr_t>(PartialSpec);
109 Inst.TemplateArgs = TemplateArgs;
110 Inst.NumTemplateArgs = NumTemplateArgs;
111 Inst.InstantiationRange = InstantiationRange;
112 SemaRef.ActiveTemplateInstantiations.push_back(Inst);
113 Invalid = false;
114 }
115}
116
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000117void Sema::InstantiatingTemplate::Clear() {
118 if (!Invalid) {
Douglas Gregor26dce442009-03-10 00:06:19 +0000119 SemaRef.ActiveTemplateInstantiations.pop_back();
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000120 Invalid = true;
121 }
Douglas Gregor26dce442009-03-10 00:06:19 +0000122}
123
Douglas Gregordf667e72009-03-10 20:44:00 +0000124bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
125 SourceLocation PointOfInstantiation,
126 SourceRange InstantiationRange) {
127 if (SemaRef.ActiveTemplateInstantiations.size()
128 <= SemaRef.getLangOptions().InstantiationDepth)
129 return false;
130
131 SemaRef.Diag(PointOfInstantiation,
132 diag::err_template_recursion_depth_exceeded)
133 << SemaRef.getLangOptions().InstantiationDepth
134 << InstantiationRange;
135 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
136 << SemaRef.getLangOptions().InstantiationDepth;
137 return true;
138}
139
Douglas Gregoree1828a2009-03-10 18:03:33 +0000140/// \brief Prints the current instantiation stack through a series of
141/// notes.
142void Sema::PrintInstantiationStack() {
143 for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
144 Active = ActiveTemplateInstantiations.rbegin(),
145 ActiveEnd = ActiveTemplateInstantiations.rend();
146 Active != ActiveEnd;
147 ++Active) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000148 switch (Active->Kind) {
149 case ActiveTemplateInstantiation::TemplateInstantiation: {
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000150 Decl *D = reinterpret_cast<Decl *>(Active->Entity);
151 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
152 unsigned DiagID = diag::note_template_member_class_here;
153 if (isa<ClassTemplateSpecializationDecl>(Record))
154 DiagID = diag::note_template_class_instantiation_here;
155 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
156 DiagID)
157 << Context.getTypeDeclType(Record)
158 << Active->InstantiationRange;
159 } else {
160 FunctionDecl *Function = cast<FunctionDecl>(D);
161 unsigned DiagID = diag::note_template_member_function_here;
162 // FIXME: check for a function template
163 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
164 DiagID)
165 << Function
166 << Active->InstantiationRange;
167 }
Douglas Gregordf667e72009-03-10 20:44:00 +0000168 break;
169 }
170
171 case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
172 TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity);
173 std::string TemplateArgsStr
Douglas Gregor7532dc62009-03-30 22:58:21 +0000174 = TemplateSpecializationType::PrintTemplateArgumentList(
Douglas Gregordf667e72009-03-10 20:44:00 +0000175 Active->TemplateArgs,
Douglas Gregord249e1d1f2009-05-29 20:38:28 +0000176 Active->NumTemplateArgs,
177 Context.PrintingPolicy);
Douglas Gregordf667e72009-03-10 20:44:00 +0000178 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
179 diag::note_default_arg_instantiation_here)
180 << (Template->getNameAsString() + TemplateArgsStr)
181 << Active->InstantiationRange;
182 break;
183 }
Douglas Gregor637a4092009-06-10 23:47:09 +0000184
185 case ActiveTemplateInstantiation::PartialSpecDeductionInstantiation: {
186 ClassTemplatePartialSpecializationDecl *PartialSpec
187 = cast<ClassTemplatePartialSpecializationDecl>((Decl *)Active->Entity);
Douglas Gregor637a4092009-06-10 23:47:09 +0000188 // FIXME: The active template instantiation's template arguments
189 // are interesting, too. We should add something like [with T =
190 // foo, U = bar, etc.] to the string.
191 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
192 diag::note_partial_spec_deduct_instantiation_here)
Douglas Gregor02cbbd22009-06-11 18:10:32 +0000193 << Context.getTypeDeclType(PartialSpec)
Douglas Gregor637a4092009-06-10 23:47:09 +0000194 << Active->InstantiationRange;
195 break;
196 }
197
Douglas Gregordf667e72009-03-10 20:44:00 +0000198 }
Douglas Gregoree1828a2009-03-10 18:03:33 +0000199 }
200}
201
Douglas Gregor99ebf652009-02-27 19:31:52 +0000202//===----------------------------------------------------------------------===/
203// Template Instantiation for Types
204//===----------------------------------------------------------------------===/
Douglas Gregorcd281c32009-02-28 00:25:32 +0000205namespace {
206 class VISIBILITY_HIDDEN TemplateTypeInstantiator {
207 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +0000208 const TemplateArgumentList &TemplateArgs;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000209 SourceLocation Loc;
210 DeclarationName Entity;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000211
Douglas Gregorcd281c32009-02-28 00:25:32 +0000212 public:
213 TemplateTypeInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +0000214 const TemplateArgumentList &TemplateArgs,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000215 SourceLocation Loc,
216 DeclarationName Entity)
217 : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
Douglas Gregor7e063902009-05-11 23:53:27 +0000218 Loc(Loc), Entity(Entity) { }
Douglas Gregorcd281c32009-02-28 00:25:32 +0000219
220 QualType operator()(QualType T) const { return Instantiate(T); }
221
222 QualType Instantiate(QualType T) const;
223
224 // Declare instantiate functions for each type.
225#define TYPE(Class, Base) \
226 QualType Instantiate##Class##Type(const Class##Type *T, \
227 unsigned Quals) const;
228#define ABSTRACT_TYPE(Class, Base)
229#include "clang/AST/TypeNodes.def"
230 };
231}
232
233QualType
234TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T,
235 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000236 // FIXME: Implement this
237 assert(false && "Cannot instantiate ExtQualType yet");
238 return QualType();
239}
240
Douglas Gregorcd281c32009-02-28 00:25:32 +0000241QualType
242TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T,
243 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000244 assert(false && "Builtin types are not dependent and cannot be instantiated");
Douglas Gregorcd281c32009-02-28 00:25:32 +0000245 return QualType(T, Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000246}
247
Douglas Gregorcd281c32009-02-28 00:25:32 +0000248QualType
249TemplateTypeInstantiator::
250InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000251 // FIXME: Implement this
252 assert(false && "Cannot instantiate FixedWidthIntType yet");
253 return QualType();
254}
255
Douglas Gregorcd281c32009-02-28 00:25:32 +0000256QualType
257TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T,
258 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000259 // FIXME: Implement this
260 assert(false && "Cannot instantiate ComplexType yet");
261 return QualType();
262}
263
Douglas Gregorcd281c32009-02-28 00:25:32 +0000264QualType
265TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T,
266 unsigned Quals) const {
267 QualType PointeeType = Instantiate(T->getPointeeType());
268 if (PointeeType.isNull())
269 return QualType();
270
271 return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000272}
273
Douglas Gregorcd281c32009-02-28 00:25:32 +0000274QualType
275TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T,
276 unsigned Quals) const {
Anders Carlsson859ba502009-06-12 16:23:10 +0000277 QualType PointeeType = Instantiate(T->getPointeeType());
278 if (PointeeType.isNull())
279 return QualType();
280
281 QualType BlockTy = SemaRef.Context.getBlockPointerType(PointeeType);
282
283 return BlockTy.getQualifiedType(Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000284}
285
Sebastian Redl7c80bd62009-03-16 23:22:08 +0000286QualType
287TemplateTypeInstantiator::InstantiateLValueReferenceType(
288 const LValueReferenceType *T, unsigned Quals) const {
Douglas Gregorcd281c32009-02-28 00:25:32 +0000289 QualType ReferentType = Instantiate(T->getPointeeType());
290 if (ReferentType.isNull())
291 return QualType();
292
Sebastian Redl7c80bd62009-03-16 23:22:08 +0000293 return SemaRef.BuildReferenceType(ReferentType, true, Quals, Loc, Entity);
294}
295
296QualType
297TemplateTypeInstantiator::InstantiateRValueReferenceType(
298 const RValueReferenceType *T, unsigned Quals) const {
299 QualType ReferentType = Instantiate(T->getPointeeType());
300 if (ReferentType.isNull())
301 return QualType();
302
303 return SemaRef.BuildReferenceType(ReferentType, false, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000304}
305
Douglas Gregorcd281c32009-02-28 00:25:32 +0000306QualType
307TemplateTypeInstantiator::
308InstantiateMemberPointerType(const MemberPointerType *T,
309 unsigned Quals) const {
Douglas Gregor949bf692009-06-09 22:17:39 +0000310 QualType PointeeType = Instantiate(T->getPointeeType());
311 if (PointeeType.isNull())
312 return QualType();
313
314 QualType ClassType = Instantiate(QualType(T->getClass(), 0));
315 if (ClassType.isNull())
316 return QualType();
317
318 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Quals, Loc,
319 Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000320}
321
Douglas Gregorcd281c32009-02-28 00:25:32 +0000322QualType
323TemplateTypeInstantiator::
324InstantiateConstantArrayType(const ConstantArrayType *T,
325 unsigned Quals) const {
326 QualType ElementType = Instantiate(T->getElementType());
327 if (ElementType.isNull())
328 return ElementType;
329
330 // Build a temporary integer literal to specify the size for
331 // BuildArrayType. Since we have already checked the size as part of
332 // creating the dependent array type in the first place, we know
Douglas Gregorff668032009-05-13 18:28:20 +0000333 // there aren't any errors. However, we do need to determine what
334 // C++ type to give the size expression.
335 llvm::APInt Size = T->getSize();
336 QualType Types[] = {
337 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
338 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
339 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
340 };
341 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
342 QualType SizeType;
343 for (unsigned I = 0; I != NumTypes; ++I)
344 if (Size.getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
345 SizeType = Types[I];
346 break;
347 }
348
349 if (SizeType.isNull())
350 SizeType = SemaRef.Context.getFixedWidthIntType(Size.getBitWidth(), false);
351
352 IntegerLiteral ArraySize(Size, SizeType, Loc);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000353 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
354 &ArraySize, T->getIndexTypeQualifier(),
355 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000356}
357
Douglas Gregorcd281c32009-02-28 00:25:32 +0000358QualType
359TemplateTypeInstantiator::
360InstantiateIncompleteArrayType(const IncompleteArrayType *T,
361 unsigned Quals) const {
362 QualType ElementType = Instantiate(T->getElementType());
363 if (ElementType.isNull())
364 return ElementType;
365
366 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
367 0, T->getIndexTypeQualifier(),
368 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000369}
370
Douglas Gregorcd281c32009-02-28 00:25:32 +0000371QualType
372TemplateTypeInstantiator::
373InstantiateVariableArrayType(const VariableArrayType *T,
374 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000375 // FIXME: Implement this
376 assert(false && "Cannot instantiate VariableArrayType yet");
377 return QualType();
378}
379
Douglas Gregorcd281c32009-02-28 00:25:32 +0000380QualType
381TemplateTypeInstantiator::
382InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,
383 unsigned Quals) const {
Anders Carlsson76b1c842009-03-15 20:12:13 +0000384 Expr *ArraySize = T->getSizeExpr();
385 assert(ArraySize->isValueDependent() &&
386 "dependent sized array types must have value dependent size expr");
387
388 // Instantiate the element type if needed
389 QualType ElementType = T->getElementType();
390 if (ElementType->isDependentType()) {
391 ElementType = Instantiate(ElementType);
392 if (ElementType.isNull())
393 return QualType();
394 }
395
396 // Instantiate the size expression
397 Sema::OwningExprResult InstantiatedArraySize =
Douglas Gregor7e063902009-05-11 23:53:27 +0000398 SemaRef.InstantiateExpr(ArraySize, TemplateArgs);
Anders Carlsson76b1c842009-03-15 20:12:13 +0000399 if (InstantiatedArraySize.isInvalid())
400 return QualType();
401
402 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
Anders Carlssone9146f22009-05-01 19:49:17 +0000403 InstantiatedArraySize.takeAs<Expr>(),
Anders Carlsson76b1c842009-03-15 20:12:13 +0000404 T->getIndexTypeQualifier(), Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000405}
406
Douglas Gregorcd281c32009-02-28 00:25:32 +0000407QualType
408TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T,
409 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000410 // FIXME: Implement this
411 assert(false && "Cannot instantiate VectorType yet");
412 return QualType();
413}
414
Douglas Gregorcd281c32009-02-28 00:25:32 +0000415QualType
416TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T,
417 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000418 // FIXME: Implement this
419 assert(false && "Cannot instantiate ExtVectorType yet");
420 return QualType();
421}
422
Douglas Gregorcd281c32009-02-28 00:25:32 +0000423QualType
424TemplateTypeInstantiator::
425InstantiateFunctionProtoType(const FunctionProtoType *T,
426 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000427 QualType ResultType = Instantiate(T->getResultType());
428 if (ResultType.isNull())
429 return ResultType;
430
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000431 llvm::SmallVector<QualType, 4> ParamTypes;
Douglas Gregor724651c2009-02-28 01:04:19 +0000432 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
433 ParamEnd = T->arg_type_end();
434 Param != ParamEnd; ++Param) {
435 QualType P = Instantiate(*Param);
436 if (P.isNull())
437 return P;
438
439 ParamTypes.push_back(P);
440 }
441
Douglas Gregor02cbbd22009-06-11 18:10:32 +0000442 return SemaRef.BuildFunctionType(ResultType, ParamTypes.data(),
Douglas Gregor724651c2009-02-28 01:04:19 +0000443 ParamTypes.size(),
444 T->isVariadic(), T->getTypeQuals(),
445 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000446}
447
Douglas Gregorcd281c32009-02-28 00:25:32 +0000448QualType
449TemplateTypeInstantiator::
450InstantiateFunctionNoProtoType(const FunctionNoProtoType *T,
451 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000452 assert(false && "Functions without prototypes cannot be dependent.");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000453 return QualType();
454}
455
Douglas Gregorcd281c32009-02-28 00:25:32 +0000456QualType
457TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T,
458 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000459 TypedefDecl *Typedef
Douglas Gregored961e72009-05-27 17:54:46 +0000460 = cast_or_null<TypedefDecl>(
461 SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000462 if (!Typedef)
463 return QualType();
464
465 return SemaRef.Context.getTypeDeclType(Typedef);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000466}
467
Douglas Gregorcd281c32009-02-28 00:25:32 +0000468QualType
469TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T,
470 unsigned Quals) const {
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000471 Sema::OwningExprResult E
472 = SemaRef.InstantiateExpr(T->getUnderlyingExpr(), TemplateArgs);
473 if (E.isInvalid())
474 return QualType();
475
476 return SemaRef.Context.getTypeOfExprType(E.takeAs<Expr>());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000477}
478
Douglas Gregorcd281c32009-02-28 00:25:32 +0000479QualType
480TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T,
481 unsigned Quals) const {
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000482 QualType Underlying = Instantiate(T->getUnderlyingType());
483 if (Underlying.isNull())
484 return QualType();
485
486 return SemaRef.Context.getTypeOfType(Underlying);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000487}
488
Douglas Gregorcd281c32009-02-28 00:25:32 +0000489QualType
490TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T,
491 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000492 RecordDecl *Record
Douglas Gregored961e72009-05-27 17:54:46 +0000493 = cast_or_null<RecordDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000494 if (!Record)
495 return QualType();
496
497 return SemaRef.Context.getTypeDeclType(Record);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000498}
499
Douglas Gregorcd281c32009-02-28 00:25:32 +0000500QualType
Douglas Gregorcd281c32009-02-28 00:25:32 +0000501TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T,
502 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000503 EnumDecl *Enum
Douglas Gregored961e72009-05-27 17:54:46 +0000504 = cast_or_null<EnumDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000505 if (!Enum)
506 return QualType();
507
508 return SemaRef.Context.getTypeDeclType(Enum);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000509}
510
Douglas Gregorcd281c32009-02-28 00:25:32 +0000511QualType
512TemplateTypeInstantiator::
513InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,
514 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000515 if (T->getDepth() == 0) {
516 // Replace the template type parameter with its corresponding
517 // template argument.
Douglas Gregor99ebf652009-02-27 19:31:52 +0000518 assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
519 "Template argument kind mismatch");
520 QualType Result = TemplateArgs[T->getIndex()].getAsType();
Douglas Gregorcd281c32009-02-28 00:25:32 +0000521 if (Result.isNull() || !Quals)
Douglas Gregor99ebf652009-02-27 19:31:52 +0000522 return Result;
523
524 // C++ [dcl.ref]p1:
525 // [...] Cv-qualified references are ill-formed except when
526 // the cv-qualifiers are introduced through the use of a
527 // typedef (7.1.3) or of a template type argument (14.3), in
528 // which case the cv-qualifiers are ignored.
Douglas Gregorcd281c32009-02-28 00:25:32 +0000529 if (Quals && Result->isReferenceType())
530 Quals = 0;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000531
Douglas Gregorcd281c32009-02-28 00:25:32 +0000532 return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000533 }
534
535 // The template type parameter comes from an inner template (e.g.,
536 // the template parameter list of a member template inside the
537 // template we are instantiating). Create a new template type
538 // parameter with the template "level" reduced by one.
539 return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
540 T->getIndex(),
Douglas Gregorcd281c32009-02-28 00:25:32 +0000541 T->getName())
542 .getQualifiedType(Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000543}
544
Douglas Gregorcd281c32009-02-28 00:25:32 +0000545QualType
546TemplateTypeInstantiator::
Douglas Gregor7532dc62009-03-30 22:58:21 +0000547InstantiateTemplateSpecializationType(
548 const TemplateSpecializationType *T,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000549 unsigned Quals) const {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000550 llvm::SmallVector<TemplateArgument, 4> InstantiatedTemplateArgs;
Douglas Gregor40808ce2009-03-09 23:48:35 +0000551 InstantiatedTemplateArgs.reserve(T->getNumArgs());
Douglas Gregor7532dc62009-03-30 22:58:21 +0000552 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
Douglas Gregor40808ce2009-03-09 23:48:35 +0000553 Arg != ArgEnd; ++Arg) {
Douglas Gregor91333002009-06-11 00:06:24 +0000554 TemplateArgument InstArg = SemaRef.Instantiate(*Arg, TemplateArgs);
555 if (InstArg.isNull())
556 return QualType();
Douglas Gregor40808ce2009-03-09 23:48:35 +0000557
Douglas Gregor91333002009-06-11 00:06:24 +0000558 InstantiatedTemplateArgs.push_back(InstArg);
Douglas Gregor40808ce2009-03-09 23:48:35 +0000559 }
560
Mike Stump390b4cc2009-05-16 07:39:55 +0000561 // FIXME: We're missing the locations of the template name, '<', and '>'.
Douglas Gregorde650ae2009-03-31 18:38:02 +0000562
563 TemplateName Name = SemaRef.InstantiateTemplateName(T->getTemplateName(),
564 Loc,
Douglas Gregor7e063902009-05-11 23:53:27 +0000565 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +0000566
567 return SemaRef.CheckTemplateIdType(Name, Loc, SourceLocation(),
Douglas Gregor02cbbd22009-06-11 18:10:32 +0000568 InstantiatedTemplateArgs.data(),
Douglas Gregor7532dc62009-03-30 22:58:21 +0000569 InstantiatedTemplateArgs.size(),
570 SourceLocation());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000571}
572
Douglas Gregorcd281c32009-02-28 00:25:32 +0000573QualType
574TemplateTypeInstantiator::
Douglas Gregore4e5b052009-03-19 00:18:19 +0000575InstantiateQualifiedNameType(const QualifiedNameType *T,
576 unsigned Quals) const {
Douglas Gregord57959a2009-03-27 23:10:48 +0000577 // When we instantiated a qualified name type, there's no point in
578 // keeping the qualification around in the instantiated result. So,
579 // just instantiate the named type.
580 return (*this)(T->getNamedType());
581}
582
583QualType
584TemplateTypeInstantiator::
585InstantiateTypenameType(const TypenameType *T, unsigned Quals) const {
Douglas Gregor17343172009-04-01 00:28:59 +0000586 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
587 // When the typename type refers to a template-id, the template-id
588 // is dependent and has enough information to instantiate the
589 // result of the typename type. Since we don't care about keeping
590 // the spelling of the typename type in template instantiations,
591 // we just instantiate the template-id.
592 return InstantiateTemplateSpecializationType(TemplateId, Quals);
593 }
594
Douglas Gregord57959a2009-03-27 23:10:48 +0000595 NestedNameSpecifier *NNS
596 = SemaRef.InstantiateNestedNameSpecifier(T->getQualifier(),
597 SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +0000598 TemplateArgs);
Douglas Gregord57959a2009-03-27 23:10:48 +0000599 if (!NNS)
600 return QualType();
601
Douglas Gregor17343172009-04-01 00:28:59 +0000602 return SemaRef.CheckTypenameType(NNS, *T->getIdentifier(), SourceRange(Loc));
Douglas Gregore4e5b052009-03-19 00:18:19 +0000603}
604
605QualType
606TemplateTypeInstantiator::
Douglas Gregorcd281c32009-02-28 00:25:32 +0000607InstantiateObjCInterfaceType(const ObjCInterfaceType *T,
608 unsigned Quals) const {
609 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000610 return QualType();
611}
612
Douglas Gregorcd281c32009-02-28 00:25:32 +0000613QualType
614TemplateTypeInstantiator::
615InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T,
616 unsigned Quals) const {
617 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000618 return QualType();
619}
620
Douglas Gregorcd281c32009-02-28 00:25:32 +0000621QualType
622TemplateTypeInstantiator::
623InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T,
624 unsigned Quals) const {
625 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000626 return QualType();
627}
628
Douglas Gregorcd281c32009-02-28 00:25:32 +0000629/// \brief The actual implementation of Sema::InstantiateType().
630QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
631 // If T is not a dependent type, there is nothing to do.
632 if (!T->isDependentType())
633 return T;
634
635 switch (T->getTypeClass()) {
636#define TYPE(Class, Base) \
637 case Type::Class: \
638 return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()), \
639 T.getCVRQualifiers());
640#define ABSTRACT_TYPE(Class, Base)
641#include "clang/AST/TypeNodes.def"
642 }
643
644 assert(false && "Not all types have been decoded for instantiation");
645 return QualType();
646}
Douglas Gregor99ebf652009-02-27 19:31:52 +0000647
648/// \brief Instantiate the type T with a given set of template arguments.
649///
650/// This routine substitutes the given template arguments into the
651/// type T and produces the instantiated type.
652///
653/// \param T the type into which the template arguments will be
654/// substituted. If this type is not dependent, it will be returned
655/// immediately.
656///
657/// \param TemplateArgs the template arguments that will be
658/// substituted for the top-level template parameters within T.
659///
Douglas Gregor99ebf652009-02-27 19:31:52 +0000660/// \param Loc the location in the source code where this substitution
661/// is being performed. It will typically be the location of the
662/// declarator (if we're instantiating the type of some declaration)
663/// or the location of the type in the source code (if, e.g., we're
664/// instantiating the type of a cast expression).
665///
666/// \param Entity the name of the entity associated with a declaration
667/// being instantiated (if any). May be empty to indicate that there
668/// is no such entity (if, e.g., this is a type that occurs as part of
669/// a cast expression) or that the entity has no name (e.g., an
670/// unnamed function parameter).
671///
672/// \returns If the instantiation succeeds, the instantiated
673/// type. Otherwise, produces diagnostics and returns a NULL type.
674QualType Sema::InstantiateType(QualType T,
Douglas Gregor7e063902009-05-11 23:53:27 +0000675 const TemplateArgumentList &TemplateArgs,
Douglas Gregor99ebf652009-02-27 19:31:52 +0000676 SourceLocation Loc, DeclarationName Entity) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000677 assert(!ActiveTemplateInstantiations.empty() &&
678 "Cannot perform an instantiation without some context on the "
679 "instantiation stack");
680
Douglas Gregor99ebf652009-02-27 19:31:52 +0000681 // If T is not a dependent type, there is nothing to do.
682 if (!T->isDependentType())
683 return T;
684
Douglas Gregor7e063902009-05-11 23:53:27 +0000685 TemplateTypeInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000686 return Instantiator(T);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000687}
Douglas Gregor2943aed2009-03-03 04:44:36 +0000688
689/// \brief Instantiate the base class specifiers of the given class
690/// template specialization.
691///
692/// Produces a diagnostic and returns true on error, returns false and
693/// attaches the instantiated base classes to the class template
694/// specialization if successful.
695bool
Douglas Gregord475b8d2009-03-25 21:17:03 +0000696Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,
697 CXXRecordDecl *Pattern,
Douglas Gregor7e063902009-05-11 23:53:27 +0000698 const TemplateArgumentList &TemplateArgs) {
Douglas Gregor2943aed2009-03-03 04:44:36 +0000699 bool Invalid = false;
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000700 llvm::SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases;
Douglas Gregord475b8d2009-03-25 21:17:03 +0000701 for (ClassTemplateSpecializationDecl::base_class_iterator
702 Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end();
Douglas Gregor27b152f2009-03-10 18:52:44 +0000703 Base != BaseEnd; ++Base) {
Douglas Gregor2943aed2009-03-03 04:44:36 +0000704 if (!Base->getType()->isDependentType()) {
705 // FIXME: Allocate via ASTContext
706 InstantiatedBases.push_back(new CXXBaseSpecifier(*Base));
707 continue;
708 }
709
710 QualType BaseType = InstantiateType(Base->getType(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000711 TemplateArgs,
Douglas Gregor2943aed2009-03-03 04:44:36 +0000712 Base->getSourceRange().getBegin(),
713 DeclarationName());
714 if (BaseType.isNull()) {
715 Invalid = true;
716 continue;
717 }
718
719 if (CXXBaseSpecifier *InstantiatedBase
Douglas Gregord475b8d2009-03-25 21:17:03 +0000720 = CheckBaseSpecifier(Instantiation,
Douglas Gregor2943aed2009-03-03 04:44:36 +0000721 Base->getSourceRange(),
722 Base->isVirtual(),
723 Base->getAccessSpecifierAsWritten(),
724 BaseType,
725 /*FIXME: Not totally accurate */
726 Base->getSourceRange().getBegin()))
727 InstantiatedBases.push_back(InstantiatedBase);
728 else
729 Invalid = true;
730 }
731
Douglas Gregor27b152f2009-03-10 18:52:44 +0000732 if (!Invalid &&
Jay Foadbeaaccd2009-05-21 09:52:38 +0000733 AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(),
Douglas Gregor2943aed2009-03-03 04:44:36 +0000734 InstantiatedBases.size()))
735 Invalid = true;
736
737 return Invalid;
738}
739
Douglas Gregord475b8d2009-03-25 21:17:03 +0000740/// \brief Instantiate the definition of a class from a given pattern.
741///
742/// \param PointOfInstantiation The point of instantiation within the
743/// source code.
744///
745/// \param Instantiation is the declaration whose definition is being
746/// instantiated. This will be either a class template specialization
747/// or a member class of a class template specialization.
748///
749/// \param Pattern is the pattern from which the instantiation
750/// occurs. This will be either the declaration of a class template or
751/// the declaration of a member class of a class template.
752///
753/// \param TemplateArgs The template arguments to be substituted into
754/// the pattern.
755///
Douglas Gregord475b8d2009-03-25 21:17:03 +0000756/// \returns true if an error occurred, false otherwise.
757bool
758Sema::InstantiateClass(SourceLocation PointOfInstantiation,
759 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
Douglas Gregor93dfdb12009-05-13 00:25:59 +0000760 const TemplateArgumentList &TemplateArgs,
761 bool ExplicitInstantiation) {
Douglas Gregord475b8d2009-03-25 21:17:03 +0000762 bool Invalid = false;
763
764 CXXRecordDecl *PatternDef
765 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context));
766 if (!PatternDef) {
767 if (Pattern == Instantiation->getInstantiatedFromMemberClass()) {
768 Diag(PointOfInstantiation,
769 diag::err_implicit_instantiate_member_undefined)
770 << Context.getTypeDeclType(Instantiation);
771 Diag(Pattern->getLocation(), diag::note_member_of_template_here);
772 } else {
Douglas Gregor93dfdb12009-05-13 00:25:59 +0000773 Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
774 << ExplicitInstantiation
Douglas Gregord475b8d2009-03-25 21:17:03 +0000775 << Context.getTypeDeclType(Instantiation);
776 Diag(Pattern->getLocation(), diag::note_template_decl_here);
777 }
778 return true;
779 }
780 Pattern = PatternDef;
781
Douglas Gregord048bb72009-03-25 21:23:52 +0000782 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
Douglas Gregord475b8d2009-03-25 21:17:03 +0000783 if (Inst)
784 return true;
785
786 // Enter the scope of this instantiation. We don't use
787 // PushDeclContext because we don't have a scope.
788 DeclContext *PreviousContext = CurContext;
789 CurContext = Instantiation;
790
791 // Start the definition of this instantiation.
792 Instantiation->startDefinition();
793
794 // Instantiate the base class specifiers.
Douglas Gregor7e063902009-05-11 23:53:27 +0000795 if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
Douglas Gregord475b8d2009-03-25 21:17:03 +0000796 Invalid = true;
797
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000798 llvm::SmallVector<DeclPtrTy, 4> Fields;
Douglas Gregor6ab35242009-04-09 21:40:53 +0000799 for (RecordDecl::decl_iterator Member = Pattern->decls_begin(Context),
800 MemberEnd = Pattern->decls_end(Context);
801 Member != MemberEnd; ++Member) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000802 Decl *NewMember = InstantiateDecl(*Member, Instantiation, TemplateArgs);
Douglas Gregord475b8d2009-03-25 21:17:03 +0000803 if (NewMember) {
804 if (NewMember->isInvalidDecl())
805 Invalid = true;
806 else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember))
Chris Lattnerb28317a2009-03-28 19:18:32 +0000807 Fields.push_back(DeclPtrTy::make(Field));
Douglas Gregord475b8d2009-03-25 21:17:03 +0000808 } else {
809 // FIXME: Eventually, a NULL return will mean that one of the
Mike Stump390b4cc2009-05-16 07:39:55 +0000810 // instantiations was a semantic disaster, and we'll want to set Invalid =
811 // true. For now, we expect to skip some members that we can't yet handle.
Douglas Gregord475b8d2009-03-25 21:17:03 +0000812 }
813 }
814
815 // Finish checking fields.
Chris Lattnerb28317a2009-03-28 19:18:32 +0000816 ActOnFields(0, Instantiation->getLocation(), DeclPtrTy::make(Instantiation),
Jay Foadbeaaccd2009-05-21 09:52:38 +0000817 Fields.data(), Fields.size(), SourceLocation(), SourceLocation(),
Douglas Gregord475b8d2009-03-25 21:17:03 +0000818 0);
819
820 // Add any implicitly-declared members that we might need.
821 AddImplicitlyDeclaredMembersToClass(Instantiation);
822
823 // Exit the scope of this instantiation.
824 CurContext = PreviousContext;
825
Douglas Gregoraba43bb2009-05-26 20:50:29 +0000826 if (!Invalid)
827 Consumer.HandleTagDeclDefinition(Instantiation);
828
Douglas Gregora58861f2009-05-13 20:28:22 +0000829 // If this is an explicit instantiation, instantiate our members, too.
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000830 if (!Invalid && ExplicitInstantiation) {
831 Inst.Clear();
Douglas Gregora58861f2009-05-13 20:28:22 +0000832 InstantiateClassMembers(PointOfInstantiation, Instantiation, TemplateArgs);
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000833 }
Douglas Gregora58861f2009-05-13 20:28:22 +0000834
Douglas Gregord475b8d2009-03-25 21:17:03 +0000835 return Invalid;
836}
837
Douglas Gregor2943aed2009-03-03 04:44:36 +0000838bool
839Sema::InstantiateClassTemplateSpecialization(
840 ClassTemplateSpecializationDecl *ClassTemplateSpec,
841 bool ExplicitInstantiation) {
842 // Perform the actual instantiation on the canonical declaration.
843 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
844 Context.getCanonicalDecl(ClassTemplateSpec));
845
846 // We can only instantiate something that hasn't already been
847 // instantiated or specialized. Fail without any diagnostics: our
848 // caller will provide an error message.
849 if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
850 return true;
851
Douglas Gregor2943aed2009-03-03 04:44:36 +0000852 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
Douglas Gregord475b8d2009-03-25 21:17:03 +0000853 CXXRecordDecl *Pattern = Template->getTemplatedDecl();
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000854 const TemplateArgumentList *TemplateArgs
855 = &ClassTemplateSpec->getTemplateArgs();
856
857 // Determine whether any class template partial specializations
858 // match the given template arguments.
Douglas Gregor199d9912009-06-05 00:53:49 +0000859 typedef std::pair<ClassTemplatePartialSpecializationDecl *,
860 TemplateArgumentList *> MatchResult;
861 llvm::SmallVector<MatchResult, 4> Matched;
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000862 for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
863 Partial = Template->getPartialSpecializations().begin(),
864 PartialEnd = Template->getPartialSpecializations().end();
865 Partial != PartialEnd;
866 ++Partial) {
Douglas Gregor199d9912009-06-05 00:53:49 +0000867 if (TemplateArgumentList *Deduced
868 = DeduceTemplateArguments(&*Partial,
869 ClassTemplateSpec->getTemplateArgs()))
870 Matched.push_back(std::make_pair(&*Partial, Deduced));
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000871 }
872
873 if (Matched.size() == 1) {
Douglas Gregor199d9912009-06-05 00:53:49 +0000874 Pattern = Matched[0].first;
875 TemplateArgs = Matched[0].second;
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000876 } else if (Matched.size() > 1) {
877 // FIXME: Implement partial ordering of class template partial
878 // specializations.
879 Diag(ClassTemplateSpec->getLocation(),
880 diag::unsup_template_partial_spec_ordering);
881 }
Douglas Gregor2943aed2009-03-03 04:44:36 +0000882
883 // Note that this is an instantiation.
884 ClassTemplateSpec->setSpecializationKind(
885 ExplicitInstantiation? TSK_ExplicitInstantiation
886 : TSK_ImplicitInstantiation);
887
Douglas Gregor199d9912009-06-05 00:53:49 +0000888 bool Result = InstantiateClass(ClassTemplateSpec->getLocation(),
889 ClassTemplateSpec, Pattern, *TemplateArgs,
890 ExplicitInstantiation);
891
892 for (unsigned I = 0, N = Matched.size(); I != N; ++I) {
893 // FIXME: Implement TemplateArgumentList::Destroy!
894 // if (Matched[I].first != Pattern)
895 // Matched[I].second->Destroy(Context);
896 }
897
898 return Result;
Douglas Gregor2943aed2009-03-03 04:44:36 +0000899}
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000900
Douglas Gregora58861f2009-05-13 20:28:22 +0000901/// \brief Instantiate the definitions of all of the member of the
902/// given class, which is an instantiation of a class template or a
903/// member class of a template.
904void
905Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
906 CXXRecordDecl *Instantiation,
907 const TemplateArgumentList &TemplateArgs) {
908 for (DeclContext::decl_iterator D = Instantiation->decls_begin(Context),
909 DEnd = Instantiation->decls_end(Context);
910 D != DEnd; ++D) {
911 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(*D)) {
912 if (!Function->getBody(Context))
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000913 InstantiateFunctionDefinition(PointOfInstantiation, Function);
Douglas Gregora58861f2009-05-13 20:28:22 +0000914 } else if (VarDecl *Var = dyn_cast<VarDecl>(*D)) {
915 const VarDecl *Def = 0;
916 if (!Var->getDefinition(Def))
917 InstantiateVariableDefinition(Var);
918 } else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(*D)) {
919 if (!Record->isInjectedClassName() && !Record->getDefinition(Context)) {
920 assert(Record->getInstantiatedFromMemberClass() &&
921 "Missing instantiated-from-template information");
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000922 InstantiateClass(PointOfInstantiation, Record,
Douglas Gregora58861f2009-05-13 20:28:22 +0000923 Record->getInstantiatedFromMemberClass(),
924 TemplateArgs, true);
925 }
926 }
927 }
928}
929
930/// \brief Instantiate the definitions of all of the members of the
931/// given class template specialization, which was named as part of an
932/// explicit instantiation.
933void Sema::InstantiateClassTemplateSpecializationMembers(
934 SourceLocation PointOfInstantiation,
935 ClassTemplateSpecializationDecl *ClassTemplateSpec) {
936 // C++0x [temp.explicit]p7:
937 // An explicit instantiation that names a class template
938 // specialization is an explicit instantion of the same kind
939 // (declaration or definition) of each of its members (not
940 // including members inherited from base classes) that has not
941 // been previously explicitly specialized in the translation unit
942 // containing the explicit instantiation, except as described
943 // below.
944 InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec,
945 ClassTemplateSpec->getTemplateArgs());
946}
947
Douglas Gregorab452ba2009-03-26 23:50:42 +0000948/// \brief Instantiate a nested-name-specifier.
949NestedNameSpecifier *
950Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,
951 SourceRange Range,
Douglas Gregor7e063902009-05-11 23:53:27 +0000952 const TemplateArgumentList &TemplateArgs) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000953 // Instantiate the prefix of this nested name specifier.
954 NestedNameSpecifier *Prefix = NNS->getPrefix();
955 if (Prefix) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000956 Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000957 if (!Prefix)
958 return 0;
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000959 }
960
Douglas Gregorab452ba2009-03-26 23:50:42 +0000961 switch (NNS->getKind()) {
Douglas Gregor17343172009-04-01 00:28:59 +0000962 case NestedNameSpecifier::Identifier: {
963 assert(Prefix &&
964 "Can't have an identifier nested-name-specifier with no prefix");
965 CXXScopeSpec SS;
966 // FIXME: The source location information is all wrong.
967 SS.setRange(Range);
968 SS.setScopeRep(Prefix);
969 return static_cast<NestedNameSpecifier *>(
970 ActOnCXXNestedNameSpecifier(0, SS,
971 Range.getEnd(),
972 Range.getEnd(),
Douglas Gregor3f5b61c2009-05-14 00:28:11 +0000973 *NNS->getAsIdentifier()));
Douglas Gregorab452ba2009-03-26 23:50:42 +0000974 break;
Douglas Gregor17343172009-04-01 00:28:59 +0000975 }
Douglas Gregorab452ba2009-03-26 23:50:42 +0000976
977 case NestedNameSpecifier::Namespace:
978 case NestedNameSpecifier::Global:
979 return NNS;
980
981 case NestedNameSpecifier::TypeSpecWithTemplate:
982 case NestedNameSpecifier::TypeSpec: {
983 QualType T = QualType(NNS->getAsType(), 0);
984 if (!T->isDependentType())
985 return NNS;
986
Douglas Gregor7e063902009-05-11 23:53:27 +0000987 T = InstantiateType(T, TemplateArgs, Range.getBegin(), DeclarationName());
Douglas Gregorab452ba2009-03-26 23:50:42 +0000988 if (T.isNull())
989 return 0;
990
Douglas Gregord57959a2009-03-27 23:10:48 +0000991 if (T->isRecordType() ||
992 (getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
Douglas Gregor17343172009-04-01 00:28:59 +0000993 assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
Douglas Gregord57959a2009-03-27 23:10:48 +0000994 return NestedNameSpecifier::Create(Context, Prefix,
Douglas Gregorab452ba2009-03-26 23:50:42 +0000995 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregord57959a2009-03-27 23:10:48 +0000996 T.getTypePtr());
997 }
998
999 Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
1000 return 0;
Douglas Gregorab452ba2009-03-26 23:50:42 +00001001 }
1002 }
1003
Douglas Gregord57959a2009-03-27 23:10:48 +00001004 // Required to silence a GCC warning
Douglas Gregorab452ba2009-03-26 23:50:42 +00001005 return 0;
Douglas Gregor5953d8b2009-03-19 17:26:29 +00001006}
Douglas Gregorde650ae2009-03-31 18:38:02 +00001007
1008TemplateName
1009Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc,
Douglas Gregor7e063902009-05-11 23:53:27 +00001010 const TemplateArgumentList &TemplateArgs) {
Douglas Gregorde650ae2009-03-31 18:38:02 +00001011 if (TemplateTemplateParmDecl *TTP
1012 = dyn_cast_or_null<TemplateTemplateParmDecl>(
1013 Name.getAsTemplateDecl())) {
1014 assert(TTP->getDepth() == 0 &&
1015 "Cannot reduce depth of a template template parameter");
Douglas Gregor9bde7732009-03-31 20:22:05 +00001016 assert(TemplateArgs[TTP->getPosition()].getAsDecl() &&
Douglas Gregorde650ae2009-03-31 18:38:02 +00001017 "Wrong kind of template template argument");
1018 ClassTemplateDecl *ClassTemplate
1019 = dyn_cast<ClassTemplateDecl>(
1020 TemplateArgs[TTP->getPosition()].getAsDecl());
Douglas Gregor9bde7732009-03-31 20:22:05 +00001021 assert(ClassTemplate && "Expected a class template");
Douglas Gregorde650ae2009-03-31 18:38:02 +00001022 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1023 NestedNameSpecifier *NNS
1024 = InstantiateNestedNameSpecifier(QTN->getQualifier(),
1025 /*FIXME=*/SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +00001026 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +00001027 if (NNS)
1028 return Context.getQualifiedTemplateName(NNS,
1029 QTN->hasTemplateKeyword(),
1030 ClassTemplate);
1031 }
1032
1033 return TemplateName(ClassTemplate);
1034 } else if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1035 NestedNameSpecifier *NNS
1036 = InstantiateNestedNameSpecifier(DTN->getQualifier(),
1037 /*FIXME=*/SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +00001038 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +00001039
1040 if (!NNS) // FIXME: Not the best recovery strategy.
1041 return Name;
1042
1043 if (NNS->isDependent())
1044 return Context.getDependentTemplateName(NNS, DTN->getName());
1045
1046 // Somewhat redundant with ActOnDependentTemplateName.
1047 CXXScopeSpec SS;
1048 SS.setRange(SourceRange(Loc));
1049 SS.setScopeRep(NNS);
1050 TemplateTy Template;
1051 TemplateNameKind TNK = isTemplateName(*DTN->getName(), 0, Template, &SS);
1052 if (TNK == TNK_Non_template) {
1053 Diag(Loc, diag::err_template_kw_refers_to_non_template)
1054 << DTN->getName();
1055 return Name;
1056 } else if (TNK == TNK_Function_template) {
1057 Diag(Loc, diag::err_template_kw_refers_to_non_template)
1058 << DTN->getName();
1059 return Name;
1060 }
1061
1062 return Template.getAsVal<TemplateName>();
1063 }
1064
1065
1066
Mike Stump390b4cc2009-05-16 07:39:55 +00001067 // FIXME: Even if we're referring to a Decl that isn't a template template
1068 // parameter, we may need to instantiate the outer contexts of that
1069 // Decl. However, this won't be needed until we implement member templates.
Douglas Gregorde650ae2009-03-31 18:38:02 +00001070 return Name;
1071}
Douglas Gregor91333002009-06-11 00:06:24 +00001072
1073TemplateArgument Sema::Instantiate(TemplateArgument Arg,
1074 const TemplateArgumentList &TemplateArgs) {
1075 switch (Arg.getKind()) {
1076 case TemplateArgument::Null:
1077 assert(false && "Should never have a NULL template argument");
1078 break;
1079
1080 case TemplateArgument::Type: {
1081 QualType T = InstantiateType(Arg.getAsType(), TemplateArgs,
1082 Arg.getLocation(), DeclarationName());
1083 if (T.isNull())
1084 return TemplateArgument();
1085
1086 return TemplateArgument(Arg.getLocation(), T);
1087 }
1088
1089 case TemplateArgument::Declaration:
1090 // FIXME: Template instantiation for template template parameters.
1091 return Arg;
1092
1093 case TemplateArgument::Integral:
1094 return Arg;
1095
1096 case TemplateArgument::Expression: {
1097 Sema::OwningExprResult E = InstantiateExpr(Arg.getAsExpr(), TemplateArgs);
1098 if (E.isInvalid())
1099 return TemplateArgument();
1100 return TemplateArgument(E.takeAs<Expr>());
1101 }
1102 }
1103
1104 assert(false && "Unhandled template argument kind");
1105 return TemplateArgument();
1106}