blob: c1f67c78ad2d746a5fe3908ce10ea2ea3e5613f1 [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 Gregorf3e7ce42009-05-18 17:01:57 +000093void Sema::InstantiatingTemplate::Clear() {
94 if (!Invalid) {
Douglas Gregor26dce442009-03-10 00:06:19 +000095 SemaRef.ActiveTemplateInstantiations.pop_back();
Douglas Gregorf3e7ce42009-05-18 17:01:57 +000096 Invalid = true;
97 }
Douglas Gregor26dce442009-03-10 00:06:19 +000098}
99
Douglas Gregordf667e72009-03-10 20:44:00 +0000100bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
101 SourceLocation PointOfInstantiation,
102 SourceRange InstantiationRange) {
103 if (SemaRef.ActiveTemplateInstantiations.size()
104 <= SemaRef.getLangOptions().InstantiationDepth)
105 return false;
106
107 SemaRef.Diag(PointOfInstantiation,
108 diag::err_template_recursion_depth_exceeded)
109 << SemaRef.getLangOptions().InstantiationDepth
110 << InstantiationRange;
111 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
112 << SemaRef.getLangOptions().InstantiationDepth;
113 return true;
114}
115
Douglas Gregoree1828a2009-03-10 18:03:33 +0000116/// \brief Prints the current instantiation stack through a series of
117/// notes.
118void Sema::PrintInstantiationStack() {
119 for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
120 Active = ActiveTemplateInstantiations.rbegin(),
121 ActiveEnd = ActiveTemplateInstantiations.rend();
122 Active != ActiveEnd;
123 ++Active) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000124 switch (Active->Kind) {
125 case ActiveTemplateInstantiation::TemplateInstantiation: {
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000126 Decl *D = reinterpret_cast<Decl *>(Active->Entity);
127 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
128 unsigned DiagID = diag::note_template_member_class_here;
129 if (isa<ClassTemplateSpecializationDecl>(Record))
130 DiagID = diag::note_template_class_instantiation_here;
131 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
132 DiagID)
133 << Context.getTypeDeclType(Record)
134 << Active->InstantiationRange;
135 } else {
136 FunctionDecl *Function = cast<FunctionDecl>(D);
137 unsigned DiagID = diag::note_template_member_function_here;
138 // FIXME: check for a function template
139 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
140 DiagID)
141 << Function
142 << Active->InstantiationRange;
143 }
Douglas Gregordf667e72009-03-10 20:44:00 +0000144 break;
145 }
146
147 case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
148 TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity);
149 std::string TemplateArgsStr
Douglas Gregor7532dc62009-03-30 22:58:21 +0000150 = TemplateSpecializationType::PrintTemplateArgumentList(
Douglas Gregordf667e72009-03-10 20:44:00 +0000151 Active->TemplateArgs,
Douglas Gregord249e1d1f2009-05-29 20:38:28 +0000152 Active->NumTemplateArgs,
153 Context.PrintingPolicy);
Douglas Gregordf667e72009-03-10 20:44:00 +0000154 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr),
155 diag::note_default_arg_instantiation_here)
156 << (Template->getNameAsString() + TemplateArgsStr)
157 << Active->InstantiationRange;
158 break;
159 }
160 }
Douglas Gregoree1828a2009-03-10 18:03:33 +0000161 }
162}
163
Douglas Gregor99ebf652009-02-27 19:31:52 +0000164//===----------------------------------------------------------------------===/
165// Template Instantiation for Types
166//===----------------------------------------------------------------------===/
Douglas Gregorcd281c32009-02-28 00:25:32 +0000167namespace {
168 class VISIBILITY_HIDDEN TemplateTypeInstantiator {
169 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +0000170 const TemplateArgumentList &TemplateArgs;
Douglas Gregorcd281c32009-02-28 00:25:32 +0000171 SourceLocation Loc;
172 DeclarationName Entity;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000173
Douglas Gregorcd281c32009-02-28 00:25:32 +0000174 public:
175 TemplateTypeInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +0000176 const TemplateArgumentList &TemplateArgs,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000177 SourceLocation Loc,
178 DeclarationName Entity)
179 : SemaRef(SemaRef), TemplateArgs(TemplateArgs),
Douglas Gregor7e063902009-05-11 23:53:27 +0000180 Loc(Loc), Entity(Entity) { }
Douglas Gregorcd281c32009-02-28 00:25:32 +0000181
182 QualType operator()(QualType T) const { return Instantiate(T); }
183
184 QualType Instantiate(QualType T) const;
185
186 // Declare instantiate functions for each type.
187#define TYPE(Class, Base) \
188 QualType Instantiate##Class##Type(const Class##Type *T, \
189 unsigned Quals) const;
190#define ABSTRACT_TYPE(Class, Base)
191#include "clang/AST/TypeNodes.def"
192 };
193}
194
195QualType
196TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T,
197 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000198 // FIXME: Implement this
199 assert(false && "Cannot instantiate ExtQualType yet");
200 return QualType();
201}
202
Douglas Gregorcd281c32009-02-28 00:25:32 +0000203QualType
204TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T,
205 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000206 assert(false && "Builtin types are not dependent and cannot be instantiated");
Douglas Gregorcd281c32009-02-28 00:25:32 +0000207 return QualType(T, Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000208}
209
Douglas Gregorcd281c32009-02-28 00:25:32 +0000210QualType
211TemplateTypeInstantiator::
212InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000213 // FIXME: Implement this
214 assert(false && "Cannot instantiate FixedWidthIntType yet");
215 return QualType();
216}
217
Douglas Gregorcd281c32009-02-28 00:25:32 +0000218QualType
219TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T,
220 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000221 // FIXME: Implement this
222 assert(false && "Cannot instantiate ComplexType yet");
223 return QualType();
224}
225
Douglas Gregorcd281c32009-02-28 00:25:32 +0000226QualType
227TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T,
228 unsigned Quals) const {
229 QualType PointeeType = Instantiate(T->getPointeeType());
230 if (PointeeType.isNull())
231 return QualType();
232
233 return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000234}
235
Douglas Gregorcd281c32009-02-28 00:25:32 +0000236QualType
237TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T,
238 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000239 // FIXME: Implement this
240 assert(false && "Cannot instantiate BlockPointerType yet");
241 return QualType();
242}
243
Sebastian Redl7c80bd62009-03-16 23:22:08 +0000244QualType
245TemplateTypeInstantiator::InstantiateLValueReferenceType(
246 const LValueReferenceType *T, unsigned Quals) const {
Douglas Gregorcd281c32009-02-28 00:25:32 +0000247 QualType ReferentType = Instantiate(T->getPointeeType());
248 if (ReferentType.isNull())
249 return QualType();
250
Sebastian Redl7c80bd62009-03-16 23:22:08 +0000251 return SemaRef.BuildReferenceType(ReferentType, true, Quals, Loc, Entity);
252}
253
254QualType
255TemplateTypeInstantiator::InstantiateRValueReferenceType(
256 const RValueReferenceType *T, unsigned Quals) const {
257 QualType ReferentType = Instantiate(T->getPointeeType());
258 if (ReferentType.isNull())
259 return QualType();
260
261 return SemaRef.BuildReferenceType(ReferentType, false, Quals, Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000262}
263
Douglas Gregorcd281c32009-02-28 00:25:32 +0000264QualType
265TemplateTypeInstantiator::
266InstantiateMemberPointerType(const MemberPointerType *T,
267 unsigned Quals) const {
Douglas Gregor949bf692009-06-09 22:17:39 +0000268 QualType PointeeType = Instantiate(T->getPointeeType());
269 if (PointeeType.isNull())
270 return QualType();
271
272 QualType ClassType = Instantiate(QualType(T->getClass(), 0));
273 if (ClassType.isNull())
274 return QualType();
275
276 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Quals, Loc,
277 Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000278}
279
Douglas Gregorcd281c32009-02-28 00:25:32 +0000280QualType
281TemplateTypeInstantiator::
282InstantiateConstantArrayType(const ConstantArrayType *T,
283 unsigned Quals) const {
284 QualType ElementType = Instantiate(T->getElementType());
285 if (ElementType.isNull())
286 return ElementType;
287
288 // Build a temporary integer literal to specify the size for
289 // BuildArrayType. Since we have already checked the size as part of
290 // creating the dependent array type in the first place, we know
Douglas Gregorff668032009-05-13 18:28:20 +0000291 // there aren't any errors. However, we do need to determine what
292 // C++ type to give the size expression.
293 llvm::APInt Size = T->getSize();
294 QualType Types[] = {
295 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
296 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
297 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
298 };
299 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
300 QualType SizeType;
301 for (unsigned I = 0; I != NumTypes; ++I)
302 if (Size.getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
303 SizeType = Types[I];
304 break;
305 }
306
307 if (SizeType.isNull())
308 SizeType = SemaRef.Context.getFixedWidthIntType(Size.getBitWidth(), false);
309
310 IntegerLiteral ArraySize(Size, SizeType, Loc);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000311 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
312 &ArraySize, T->getIndexTypeQualifier(),
313 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000314}
315
Douglas Gregorcd281c32009-02-28 00:25:32 +0000316QualType
317TemplateTypeInstantiator::
318InstantiateIncompleteArrayType(const IncompleteArrayType *T,
319 unsigned Quals) const {
320 QualType ElementType = Instantiate(T->getElementType());
321 if (ElementType.isNull())
322 return ElementType;
323
324 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
325 0, T->getIndexTypeQualifier(),
326 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000327}
328
Douglas Gregorcd281c32009-02-28 00:25:32 +0000329QualType
330TemplateTypeInstantiator::
331InstantiateVariableArrayType(const VariableArrayType *T,
332 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000333 // FIXME: Implement this
334 assert(false && "Cannot instantiate VariableArrayType yet");
335 return QualType();
336}
337
Douglas Gregorcd281c32009-02-28 00:25:32 +0000338QualType
339TemplateTypeInstantiator::
340InstantiateDependentSizedArrayType(const DependentSizedArrayType *T,
341 unsigned Quals) const {
Anders Carlsson76b1c842009-03-15 20:12:13 +0000342 Expr *ArraySize = T->getSizeExpr();
343 assert(ArraySize->isValueDependent() &&
344 "dependent sized array types must have value dependent size expr");
345
346 // Instantiate the element type if needed
347 QualType ElementType = T->getElementType();
348 if (ElementType->isDependentType()) {
349 ElementType = Instantiate(ElementType);
350 if (ElementType.isNull())
351 return QualType();
352 }
353
354 // Instantiate the size expression
355 Sema::OwningExprResult InstantiatedArraySize =
Douglas Gregor7e063902009-05-11 23:53:27 +0000356 SemaRef.InstantiateExpr(ArraySize, TemplateArgs);
Anders Carlsson76b1c842009-03-15 20:12:13 +0000357 if (InstantiatedArraySize.isInvalid())
358 return QualType();
359
360 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(),
Anders Carlssone9146f22009-05-01 19:49:17 +0000361 InstantiatedArraySize.takeAs<Expr>(),
Anders Carlsson76b1c842009-03-15 20:12:13 +0000362 T->getIndexTypeQualifier(), Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000363}
364
Douglas Gregorcd281c32009-02-28 00:25:32 +0000365QualType
366TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T,
367 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000368 // FIXME: Implement this
369 assert(false && "Cannot instantiate VectorType yet");
370 return QualType();
371}
372
Douglas Gregorcd281c32009-02-28 00:25:32 +0000373QualType
374TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T,
375 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000376 // FIXME: Implement this
377 assert(false && "Cannot instantiate ExtVectorType yet");
378 return QualType();
379}
380
Douglas Gregorcd281c32009-02-28 00:25:32 +0000381QualType
382TemplateTypeInstantiator::
383InstantiateFunctionProtoType(const FunctionProtoType *T,
384 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000385 QualType ResultType = Instantiate(T->getResultType());
386 if (ResultType.isNull())
387 return ResultType;
388
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000389 llvm::SmallVector<QualType, 4> ParamTypes;
Douglas Gregor724651c2009-02-28 01:04:19 +0000390 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
391 ParamEnd = T->arg_type_end();
392 Param != ParamEnd; ++Param) {
393 QualType P = Instantiate(*Param);
394 if (P.isNull())
395 return P;
396
397 ParamTypes.push_back(P);
398 }
399
400 return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0],
401 ParamTypes.size(),
402 T->isVariadic(), T->getTypeQuals(),
403 Loc, Entity);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000404}
405
Douglas Gregorcd281c32009-02-28 00:25:32 +0000406QualType
407TemplateTypeInstantiator::
408InstantiateFunctionNoProtoType(const FunctionNoProtoType *T,
409 unsigned Quals) const {
Douglas Gregor724651c2009-02-28 01:04:19 +0000410 assert(false && "Functions without prototypes cannot be dependent.");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000411 return QualType();
412}
413
Douglas Gregorcd281c32009-02-28 00:25:32 +0000414QualType
415TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T,
416 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000417 TypedefDecl *Typedef
Douglas Gregored961e72009-05-27 17:54:46 +0000418 = cast_or_null<TypedefDecl>(
419 SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000420 if (!Typedef)
421 return QualType();
422
423 return SemaRef.Context.getTypeDeclType(Typedef);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000424}
425
Douglas Gregorcd281c32009-02-28 00:25:32 +0000426QualType
427TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T,
428 unsigned Quals) const {
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000429 Sema::OwningExprResult E
430 = SemaRef.InstantiateExpr(T->getUnderlyingExpr(), TemplateArgs);
431 if (E.isInvalid())
432 return QualType();
433
434 return SemaRef.Context.getTypeOfExprType(E.takeAs<Expr>());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000435}
436
Douglas Gregorcd281c32009-02-28 00:25:32 +0000437QualType
438TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T,
439 unsigned Quals) const {
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000440 QualType Underlying = Instantiate(T->getUnderlyingType());
441 if (Underlying.isNull())
442 return QualType();
443
444 return SemaRef.Context.getTypeOfType(Underlying);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000445}
446
Douglas Gregorcd281c32009-02-28 00:25:32 +0000447QualType
448TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T,
449 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000450 RecordDecl *Record
Douglas Gregored961e72009-05-27 17:54:46 +0000451 = cast_or_null<RecordDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000452 if (!Record)
453 return QualType();
454
455 return SemaRef.Context.getTypeDeclType(Record);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000456}
457
Douglas Gregorcd281c32009-02-28 00:25:32 +0000458QualType
Douglas Gregorcd281c32009-02-28 00:25:32 +0000459TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T,
460 unsigned Quals) const {
Douglas Gregor815215d2009-05-27 05:35:12 +0000461 EnumDecl *Enum
Douglas Gregored961e72009-05-27 17:54:46 +0000462 = cast_or_null<EnumDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl()));
Douglas Gregor815215d2009-05-27 05:35:12 +0000463 if (!Enum)
464 return QualType();
465
466 return SemaRef.Context.getTypeDeclType(Enum);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000467}
468
Douglas Gregorcd281c32009-02-28 00:25:32 +0000469QualType
470TemplateTypeInstantiator::
471InstantiateTemplateTypeParmType(const TemplateTypeParmType *T,
472 unsigned Quals) const {
Douglas Gregor99ebf652009-02-27 19:31:52 +0000473 if (T->getDepth() == 0) {
474 // Replace the template type parameter with its corresponding
475 // template argument.
Douglas Gregor99ebf652009-02-27 19:31:52 +0000476 assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type &&
477 "Template argument kind mismatch");
478 QualType Result = TemplateArgs[T->getIndex()].getAsType();
Douglas Gregorcd281c32009-02-28 00:25:32 +0000479 if (Result.isNull() || !Quals)
Douglas Gregor99ebf652009-02-27 19:31:52 +0000480 return Result;
481
482 // C++ [dcl.ref]p1:
483 // [...] Cv-qualified references are ill-formed except when
484 // the cv-qualifiers are introduced through the use of a
485 // typedef (7.1.3) or of a template type argument (14.3), in
486 // which case the cv-qualifiers are ignored.
Douglas Gregorcd281c32009-02-28 00:25:32 +0000487 if (Quals && Result->isReferenceType())
488 Quals = 0;
Douglas Gregor99ebf652009-02-27 19:31:52 +0000489
Douglas Gregorcd281c32009-02-28 00:25:32 +0000490 return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000491 }
492
493 // The template type parameter comes from an inner template (e.g.,
494 // the template parameter list of a member template inside the
495 // template we are instantiating). Create a new template type
496 // parameter with the template "level" reduced by one.
497 return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1,
498 T->getIndex(),
Douglas Gregorcd281c32009-02-28 00:25:32 +0000499 T->getName())
500 .getQualifiedType(Quals);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000501}
502
Douglas Gregorcd281c32009-02-28 00:25:32 +0000503QualType
504TemplateTypeInstantiator::
Douglas Gregor7532dc62009-03-30 22:58:21 +0000505InstantiateTemplateSpecializationType(
506 const TemplateSpecializationType *T,
Douglas Gregorcd281c32009-02-28 00:25:32 +0000507 unsigned Quals) const {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000508 llvm::SmallVector<TemplateArgument, 4> InstantiatedTemplateArgs;
Douglas Gregor40808ce2009-03-09 23:48:35 +0000509 InstantiatedTemplateArgs.reserve(T->getNumArgs());
Douglas Gregor7532dc62009-03-30 22:58:21 +0000510 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
Douglas Gregor40808ce2009-03-09 23:48:35 +0000511 Arg != ArgEnd; ++Arg) {
512 switch (Arg->getKind()) {
Douglas Gregor0b9247f2009-06-04 00:03:07 +0000513 case TemplateArgument::Null:
514 assert(false && "Should never have a NULL template argument");
515 break;
516
Douglas Gregor40808ce2009-03-09 23:48:35 +0000517 case TemplateArgument::Type: {
518 QualType T = SemaRef.InstantiateType(Arg->getAsType(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000519 TemplateArgs,
Douglas Gregor40808ce2009-03-09 23:48:35 +0000520 Arg->getLocation(),
521 DeclarationName());
522 if (T.isNull())
523 return QualType();
524
525 InstantiatedTemplateArgs.push_back(
526 TemplateArgument(Arg->getLocation(), T));
527 break;
528 }
529
530 case TemplateArgument::Declaration:
531 case TemplateArgument::Integral:
532 InstantiatedTemplateArgs.push_back(*Arg);
533 break;
534
535 case TemplateArgument::Expression:
Douglas Gregorba498172009-03-13 21:01:28 +0000536 Sema::OwningExprResult E
Douglas Gregor7e063902009-05-11 23:53:27 +0000537 = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs);
Douglas Gregorba498172009-03-13 21:01:28 +0000538 if (E.isInvalid())
539 return QualType();
Anders Carlssonf1b1d592009-05-01 19:30:39 +0000540 InstantiatedTemplateArgs.push_back(E.takeAs<Expr>());
Douglas Gregor40808ce2009-03-09 23:48:35 +0000541 break;
542 }
543 }
544
Mike Stump390b4cc2009-05-16 07:39:55 +0000545 // FIXME: We're missing the locations of the template name, '<', and '>'.
Douglas Gregorde650ae2009-03-31 18:38:02 +0000546
547 TemplateName Name = SemaRef.InstantiateTemplateName(T->getTemplateName(),
548 Loc,
Douglas Gregor7e063902009-05-11 23:53:27 +0000549 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +0000550
551 return SemaRef.CheckTemplateIdType(Name, Loc, SourceLocation(),
Douglas Gregor7532dc62009-03-30 22:58:21 +0000552 &InstantiatedTemplateArgs[0],
553 InstantiatedTemplateArgs.size(),
554 SourceLocation());
Douglas Gregor99ebf652009-02-27 19:31:52 +0000555}
556
Douglas Gregorcd281c32009-02-28 00:25:32 +0000557QualType
558TemplateTypeInstantiator::
Douglas Gregore4e5b052009-03-19 00:18:19 +0000559InstantiateQualifiedNameType(const QualifiedNameType *T,
560 unsigned Quals) const {
Douglas Gregord57959a2009-03-27 23:10:48 +0000561 // When we instantiated a qualified name type, there's no point in
562 // keeping the qualification around in the instantiated result. So,
563 // just instantiate the named type.
564 return (*this)(T->getNamedType());
565}
566
567QualType
568TemplateTypeInstantiator::
569InstantiateTypenameType(const TypenameType *T, unsigned Quals) const {
Douglas Gregor17343172009-04-01 00:28:59 +0000570 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
571 // When the typename type refers to a template-id, the template-id
572 // is dependent and has enough information to instantiate the
573 // result of the typename type. Since we don't care about keeping
574 // the spelling of the typename type in template instantiations,
575 // we just instantiate the template-id.
576 return InstantiateTemplateSpecializationType(TemplateId, Quals);
577 }
578
Douglas Gregord57959a2009-03-27 23:10:48 +0000579 NestedNameSpecifier *NNS
580 = SemaRef.InstantiateNestedNameSpecifier(T->getQualifier(),
581 SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +0000582 TemplateArgs);
Douglas Gregord57959a2009-03-27 23:10:48 +0000583 if (!NNS)
584 return QualType();
585
Douglas Gregor17343172009-04-01 00:28:59 +0000586 return SemaRef.CheckTypenameType(NNS, *T->getIdentifier(), SourceRange(Loc));
Douglas Gregore4e5b052009-03-19 00:18:19 +0000587}
588
589QualType
590TemplateTypeInstantiator::
Douglas Gregorcd281c32009-02-28 00:25:32 +0000591InstantiateObjCInterfaceType(const ObjCInterfaceType *T,
592 unsigned Quals) const {
593 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000594 return QualType();
595}
596
Douglas Gregorcd281c32009-02-28 00:25:32 +0000597QualType
598TemplateTypeInstantiator::
599InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T,
600 unsigned Quals) const {
601 assert(false && "Objective-C types cannot be dependent");
Douglas Gregor99ebf652009-02-27 19:31:52 +0000602 return QualType();
603}
604
Douglas Gregorcd281c32009-02-28 00:25:32 +0000605QualType
606TemplateTypeInstantiator::
607InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *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 +0000613/// \brief The actual implementation of Sema::InstantiateType().
614QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
615 // If T is not a dependent type, there is nothing to do.
616 if (!T->isDependentType())
617 return T;
618
619 switch (T->getTypeClass()) {
620#define TYPE(Class, Base) \
621 case Type::Class: \
622 return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()), \
623 T.getCVRQualifiers());
624#define ABSTRACT_TYPE(Class, Base)
625#include "clang/AST/TypeNodes.def"
626 }
627
628 assert(false && "Not all types have been decoded for instantiation");
629 return QualType();
630}
Douglas Gregor99ebf652009-02-27 19:31:52 +0000631
632/// \brief Instantiate the type T with a given set of template arguments.
633///
634/// This routine substitutes the given template arguments into the
635/// type T and produces the instantiated type.
636///
637/// \param T the type into which the template arguments will be
638/// substituted. If this type is not dependent, it will be returned
639/// immediately.
640///
641/// \param TemplateArgs the template arguments that will be
642/// substituted for the top-level template parameters within T.
643///
Douglas Gregor99ebf652009-02-27 19:31:52 +0000644/// \param Loc the location in the source code where this substitution
645/// is being performed. It will typically be the location of the
646/// declarator (if we're instantiating the type of some declaration)
647/// or the location of the type in the source code (if, e.g., we're
648/// instantiating the type of a cast expression).
649///
650/// \param Entity the name of the entity associated with a declaration
651/// being instantiated (if any). May be empty to indicate that there
652/// is no such entity (if, e.g., this is a type that occurs as part of
653/// a cast expression) or that the entity has no name (e.g., an
654/// unnamed function parameter).
655///
656/// \returns If the instantiation succeeds, the instantiated
657/// type. Otherwise, produces diagnostics and returns a NULL type.
658QualType Sema::InstantiateType(QualType T,
Douglas Gregor7e063902009-05-11 23:53:27 +0000659 const TemplateArgumentList &TemplateArgs,
Douglas Gregor99ebf652009-02-27 19:31:52 +0000660 SourceLocation Loc, DeclarationName Entity) {
Douglas Gregordf667e72009-03-10 20:44:00 +0000661 assert(!ActiveTemplateInstantiations.empty() &&
662 "Cannot perform an instantiation without some context on the "
663 "instantiation stack");
664
Douglas Gregor99ebf652009-02-27 19:31:52 +0000665 // If T is not a dependent type, there is nothing to do.
666 if (!T->isDependentType())
667 return T;
668
Douglas Gregor7e063902009-05-11 23:53:27 +0000669 TemplateTypeInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
Douglas Gregorcd281c32009-02-28 00:25:32 +0000670 return Instantiator(T);
Douglas Gregor99ebf652009-02-27 19:31:52 +0000671}
Douglas Gregor2943aed2009-03-03 04:44:36 +0000672
673/// \brief Instantiate the base class specifiers of the given class
674/// template specialization.
675///
676/// Produces a diagnostic and returns true on error, returns false and
677/// attaches the instantiated base classes to the class template
678/// specialization if successful.
679bool
Douglas Gregord475b8d2009-03-25 21:17:03 +0000680Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation,
681 CXXRecordDecl *Pattern,
Douglas Gregor7e063902009-05-11 23:53:27 +0000682 const TemplateArgumentList &TemplateArgs) {
Douglas Gregor2943aed2009-03-03 04:44:36 +0000683 bool Invalid = false;
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000684 llvm::SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases;
Douglas Gregord475b8d2009-03-25 21:17:03 +0000685 for (ClassTemplateSpecializationDecl::base_class_iterator
686 Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end();
Douglas Gregor27b152f2009-03-10 18:52:44 +0000687 Base != BaseEnd; ++Base) {
Douglas Gregor2943aed2009-03-03 04:44:36 +0000688 if (!Base->getType()->isDependentType()) {
689 // FIXME: Allocate via ASTContext
690 InstantiatedBases.push_back(new CXXBaseSpecifier(*Base));
691 continue;
692 }
693
694 QualType BaseType = InstantiateType(Base->getType(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000695 TemplateArgs,
Douglas Gregor2943aed2009-03-03 04:44:36 +0000696 Base->getSourceRange().getBegin(),
697 DeclarationName());
698 if (BaseType.isNull()) {
699 Invalid = true;
700 continue;
701 }
702
703 if (CXXBaseSpecifier *InstantiatedBase
Douglas Gregord475b8d2009-03-25 21:17:03 +0000704 = CheckBaseSpecifier(Instantiation,
Douglas Gregor2943aed2009-03-03 04:44:36 +0000705 Base->getSourceRange(),
706 Base->isVirtual(),
707 Base->getAccessSpecifierAsWritten(),
708 BaseType,
709 /*FIXME: Not totally accurate */
710 Base->getSourceRange().getBegin()))
711 InstantiatedBases.push_back(InstantiatedBase);
712 else
713 Invalid = true;
714 }
715
Douglas Gregor27b152f2009-03-10 18:52:44 +0000716 if (!Invalid &&
Jay Foadbeaaccd2009-05-21 09:52:38 +0000717 AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(),
Douglas Gregor2943aed2009-03-03 04:44:36 +0000718 InstantiatedBases.size()))
719 Invalid = true;
720
721 return Invalid;
722}
723
Douglas Gregord475b8d2009-03-25 21:17:03 +0000724/// \brief Instantiate the definition of a class from a given pattern.
725///
726/// \param PointOfInstantiation The point of instantiation within the
727/// source code.
728///
729/// \param Instantiation is the declaration whose definition is being
730/// instantiated. This will be either a class template specialization
731/// or a member class of a class template specialization.
732///
733/// \param Pattern is the pattern from which the instantiation
734/// occurs. This will be either the declaration of a class template or
735/// the declaration of a member class of a class template.
736///
737/// \param TemplateArgs The template arguments to be substituted into
738/// the pattern.
739///
Douglas Gregord475b8d2009-03-25 21:17:03 +0000740/// \returns true if an error occurred, false otherwise.
741bool
742Sema::InstantiateClass(SourceLocation PointOfInstantiation,
743 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
Douglas Gregor93dfdb12009-05-13 00:25:59 +0000744 const TemplateArgumentList &TemplateArgs,
745 bool ExplicitInstantiation) {
Douglas Gregord475b8d2009-03-25 21:17:03 +0000746 bool Invalid = false;
747
748 CXXRecordDecl *PatternDef
749 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context));
750 if (!PatternDef) {
751 if (Pattern == Instantiation->getInstantiatedFromMemberClass()) {
752 Diag(PointOfInstantiation,
753 diag::err_implicit_instantiate_member_undefined)
754 << Context.getTypeDeclType(Instantiation);
755 Diag(Pattern->getLocation(), diag::note_member_of_template_here);
756 } else {
Douglas Gregor93dfdb12009-05-13 00:25:59 +0000757 Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
758 << ExplicitInstantiation
Douglas Gregord475b8d2009-03-25 21:17:03 +0000759 << Context.getTypeDeclType(Instantiation);
760 Diag(Pattern->getLocation(), diag::note_template_decl_here);
761 }
762 return true;
763 }
764 Pattern = PatternDef;
765
Douglas Gregord048bb72009-03-25 21:23:52 +0000766 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
Douglas Gregord475b8d2009-03-25 21:17:03 +0000767 if (Inst)
768 return true;
769
770 // Enter the scope of this instantiation. We don't use
771 // PushDeclContext because we don't have a scope.
772 DeclContext *PreviousContext = CurContext;
773 CurContext = Instantiation;
774
775 // Start the definition of this instantiation.
776 Instantiation->startDefinition();
777
778 // Instantiate the base class specifiers.
Douglas Gregor7e063902009-05-11 23:53:27 +0000779 if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
Douglas Gregord475b8d2009-03-25 21:17:03 +0000780 Invalid = true;
781
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000782 llvm::SmallVector<DeclPtrTy, 4> Fields;
Douglas Gregor6ab35242009-04-09 21:40:53 +0000783 for (RecordDecl::decl_iterator Member = Pattern->decls_begin(Context),
784 MemberEnd = Pattern->decls_end(Context);
785 Member != MemberEnd; ++Member) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000786 Decl *NewMember = InstantiateDecl(*Member, Instantiation, TemplateArgs);
Douglas Gregord475b8d2009-03-25 21:17:03 +0000787 if (NewMember) {
788 if (NewMember->isInvalidDecl())
789 Invalid = true;
790 else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember))
Chris Lattnerb28317a2009-03-28 19:18:32 +0000791 Fields.push_back(DeclPtrTy::make(Field));
Douglas Gregord475b8d2009-03-25 21:17:03 +0000792 } else {
793 // FIXME: Eventually, a NULL return will mean that one of the
Mike Stump390b4cc2009-05-16 07:39:55 +0000794 // instantiations was a semantic disaster, and we'll want to set Invalid =
795 // true. For now, we expect to skip some members that we can't yet handle.
Douglas Gregord475b8d2009-03-25 21:17:03 +0000796 }
797 }
798
799 // Finish checking fields.
Chris Lattnerb28317a2009-03-28 19:18:32 +0000800 ActOnFields(0, Instantiation->getLocation(), DeclPtrTy::make(Instantiation),
Jay Foadbeaaccd2009-05-21 09:52:38 +0000801 Fields.data(), Fields.size(), SourceLocation(), SourceLocation(),
Douglas Gregord475b8d2009-03-25 21:17:03 +0000802 0);
803
804 // Add any implicitly-declared members that we might need.
805 AddImplicitlyDeclaredMembersToClass(Instantiation);
806
807 // Exit the scope of this instantiation.
808 CurContext = PreviousContext;
809
Douglas Gregoraba43bb2009-05-26 20:50:29 +0000810 if (!Invalid)
811 Consumer.HandleTagDeclDefinition(Instantiation);
812
Douglas Gregora58861f2009-05-13 20:28:22 +0000813 // If this is an explicit instantiation, instantiate our members, too.
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000814 if (!Invalid && ExplicitInstantiation) {
815 Inst.Clear();
Douglas Gregora58861f2009-05-13 20:28:22 +0000816 InstantiateClassMembers(PointOfInstantiation, Instantiation, TemplateArgs);
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000817 }
Douglas Gregora58861f2009-05-13 20:28:22 +0000818
Douglas Gregord475b8d2009-03-25 21:17:03 +0000819 return Invalid;
820}
821
Douglas Gregor2943aed2009-03-03 04:44:36 +0000822bool
823Sema::InstantiateClassTemplateSpecialization(
824 ClassTemplateSpecializationDecl *ClassTemplateSpec,
825 bool ExplicitInstantiation) {
826 // Perform the actual instantiation on the canonical declaration.
827 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
828 Context.getCanonicalDecl(ClassTemplateSpec));
829
830 // We can only instantiate something that hasn't already been
831 // instantiated or specialized. Fail without any diagnostics: our
832 // caller will provide an error message.
833 if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared)
834 return true;
835
Douglas Gregor2943aed2009-03-03 04:44:36 +0000836 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
Douglas Gregord475b8d2009-03-25 21:17:03 +0000837 CXXRecordDecl *Pattern = Template->getTemplatedDecl();
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000838 const TemplateArgumentList *TemplateArgs
839 = &ClassTemplateSpec->getTemplateArgs();
840
841 // Determine whether any class template partial specializations
842 // match the given template arguments.
Douglas Gregor199d9912009-06-05 00:53:49 +0000843 typedef std::pair<ClassTemplatePartialSpecializationDecl *,
844 TemplateArgumentList *> MatchResult;
845 llvm::SmallVector<MatchResult, 4> Matched;
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000846 for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
847 Partial = Template->getPartialSpecializations().begin(),
848 PartialEnd = Template->getPartialSpecializations().end();
849 Partial != PartialEnd;
850 ++Partial) {
Douglas Gregor199d9912009-06-05 00:53:49 +0000851 if (TemplateArgumentList *Deduced
852 = DeduceTemplateArguments(&*Partial,
853 ClassTemplateSpec->getTemplateArgs()))
854 Matched.push_back(std::make_pair(&*Partial, Deduced));
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000855 }
856
857 if (Matched.size() == 1) {
Douglas Gregor199d9912009-06-05 00:53:49 +0000858 Pattern = Matched[0].first;
859 TemplateArgs = Matched[0].second;
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000860 } else if (Matched.size() > 1) {
861 // FIXME: Implement partial ordering of class template partial
862 // specializations.
863 Diag(ClassTemplateSpec->getLocation(),
864 diag::unsup_template_partial_spec_ordering);
865 }
Douglas Gregor2943aed2009-03-03 04:44:36 +0000866
867 // Note that this is an instantiation.
868 ClassTemplateSpec->setSpecializationKind(
869 ExplicitInstantiation? TSK_ExplicitInstantiation
870 : TSK_ImplicitInstantiation);
871
Douglas Gregor199d9912009-06-05 00:53:49 +0000872 bool Result = InstantiateClass(ClassTemplateSpec->getLocation(),
873 ClassTemplateSpec, Pattern, *TemplateArgs,
874 ExplicitInstantiation);
875
876 for (unsigned I = 0, N = Matched.size(); I != N; ++I) {
877 // FIXME: Implement TemplateArgumentList::Destroy!
878 // if (Matched[I].first != Pattern)
879 // Matched[I].second->Destroy(Context);
880 }
881
882 return Result;
Douglas Gregor2943aed2009-03-03 04:44:36 +0000883}
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000884
Douglas Gregora58861f2009-05-13 20:28:22 +0000885/// \brief Instantiate the definitions of all of the member of the
886/// given class, which is an instantiation of a class template or a
887/// member class of a template.
888void
889Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
890 CXXRecordDecl *Instantiation,
891 const TemplateArgumentList &TemplateArgs) {
892 for (DeclContext::decl_iterator D = Instantiation->decls_begin(Context),
893 DEnd = Instantiation->decls_end(Context);
894 D != DEnd; ++D) {
895 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(*D)) {
896 if (!Function->getBody(Context))
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000897 InstantiateFunctionDefinition(PointOfInstantiation, Function);
Douglas Gregora58861f2009-05-13 20:28:22 +0000898 } else if (VarDecl *Var = dyn_cast<VarDecl>(*D)) {
899 const VarDecl *Def = 0;
900 if (!Var->getDefinition(Def))
901 InstantiateVariableDefinition(Var);
902 } else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(*D)) {
903 if (!Record->isInjectedClassName() && !Record->getDefinition(Context)) {
904 assert(Record->getInstantiatedFromMemberClass() &&
905 "Missing instantiated-from-template information");
Douglas Gregorf3e7ce42009-05-18 17:01:57 +0000906 InstantiateClass(PointOfInstantiation, Record,
Douglas Gregora58861f2009-05-13 20:28:22 +0000907 Record->getInstantiatedFromMemberClass(),
908 TemplateArgs, true);
909 }
910 }
911 }
912}
913
914/// \brief Instantiate the definitions of all of the members of the
915/// given class template specialization, which was named as part of an
916/// explicit instantiation.
917void Sema::InstantiateClassTemplateSpecializationMembers(
918 SourceLocation PointOfInstantiation,
919 ClassTemplateSpecializationDecl *ClassTemplateSpec) {
920 // C++0x [temp.explicit]p7:
921 // An explicit instantiation that names a class template
922 // specialization is an explicit instantion of the same kind
923 // (declaration or definition) of each of its members (not
924 // including members inherited from base classes) that has not
925 // been previously explicitly specialized in the translation unit
926 // containing the explicit instantiation, except as described
927 // below.
928 InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec,
929 ClassTemplateSpec->getTemplateArgs());
930}
931
Douglas Gregorab452ba2009-03-26 23:50:42 +0000932/// \brief Instantiate a nested-name-specifier.
933NestedNameSpecifier *
934Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS,
935 SourceRange Range,
Douglas Gregor7e063902009-05-11 23:53:27 +0000936 const TemplateArgumentList &TemplateArgs) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000937 // Instantiate the prefix of this nested name specifier.
938 NestedNameSpecifier *Prefix = NNS->getPrefix();
939 if (Prefix) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000940 Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000941 if (!Prefix)
942 return 0;
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000943 }
944
Douglas Gregorab452ba2009-03-26 23:50:42 +0000945 switch (NNS->getKind()) {
Douglas Gregor17343172009-04-01 00:28:59 +0000946 case NestedNameSpecifier::Identifier: {
947 assert(Prefix &&
948 "Can't have an identifier nested-name-specifier with no prefix");
949 CXXScopeSpec SS;
950 // FIXME: The source location information is all wrong.
951 SS.setRange(Range);
952 SS.setScopeRep(Prefix);
953 return static_cast<NestedNameSpecifier *>(
954 ActOnCXXNestedNameSpecifier(0, SS,
955 Range.getEnd(),
956 Range.getEnd(),
Douglas Gregor3f5b61c2009-05-14 00:28:11 +0000957 *NNS->getAsIdentifier()));
Douglas Gregorab452ba2009-03-26 23:50:42 +0000958 break;
Douglas Gregor17343172009-04-01 00:28:59 +0000959 }
Douglas Gregorab452ba2009-03-26 23:50:42 +0000960
961 case NestedNameSpecifier::Namespace:
962 case NestedNameSpecifier::Global:
963 return NNS;
964
965 case NestedNameSpecifier::TypeSpecWithTemplate:
966 case NestedNameSpecifier::TypeSpec: {
967 QualType T = QualType(NNS->getAsType(), 0);
968 if (!T->isDependentType())
969 return NNS;
970
Douglas Gregor7e063902009-05-11 23:53:27 +0000971 T = InstantiateType(T, TemplateArgs, Range.getBegin(), DeclarationName());
Douglas Gregorab452ba2009-03-26 23:50:42 +0000972 if (T.isNull())
973 return 0;
974
Douglas Gregord57959a2009-03-27 23:10:48 +0000975 if (T->isRecordType() ||
976 (getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
Douglas Gregor17343172009-04-01 00:28:59 +0000977 assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
Douglas Gregord57959a2009-03-27 23:10:48 +0000978 return NestedNameSpecifier::Create(Context, Prefix,
Douglas Gregorab452ba2009-03-26 23:50:42 +0000979 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregord57959a2009-03-27 23:10:48 +0000980 T.getTypePtr());
981 }
982
983 Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
984 return 0;
Douglas Gregorab452ba2009-03-26 23:50:42 +0000985 }
986 }
987
Douglas Gregord57959a2009-03-27 23:10:48 +0000988 // Required to silence a GCC warning
Douglas Gregorab452ba2009-03-26 23:50:42 +0000989 return 0;
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000990}
Douglas Gregorde650ae2009-03-31 18:38:02 +0000991
992TemplateName
993Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc,
Douglas Gregor7e063902009-05-11 23:53:27 +0000994 const TemplateArgumentList &TemplateArgs) {
Douglas Gregorde650ae2009-03-31 18:38:02 +0000995 if (TemplateTemplateParmDecl *TTP
996 = dyn_cast_or_null<TemplateTemplateParmDecl>(
997 Name.getAsTemplateDecl())) {
998 assert(TTP->getDepth() == 0 &&
999 "Cannot reduce depth of a template template parameter");
Douglas Gregor9bde7732009-03-31 20:22:05 +00001000 assert(TemplateArgs[TTP->getPosition()].getAsDecl() &&
Douglas Gregorde650ae2009-03-31 18:38:02 +00001001 "Wrong kind of template template argument");
1002 ClassTemplateDecl *ClassTemplate
1003 = dyn_cast<ClassTemplateDecl>(
1004 TemplateArgs[TTP->getPosition()].getAsDecl());
Douglas Gregor9bde7732009-03-31 20:22:05 +00001005 assert(ClassTemplate && "Expected a class template");
Douglas Gregorde650ae2009-03-31 18:38:02 +00001006 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1007 NestedNameSpecifier *NNS
1008 = InstantiateNestedNameSpecifier(QTN->getQualifier(),
1009 /*FIXME=*/SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +00001010 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +00001011 if (NNS)
1012 return Context.getQualifiedTemplateName(NNS,
1013 QTN->hasTemplateKeyword(),
1014 ClassTemplate);
1015 }
1016
1017 return TemplateName(ClassTemplate);
1018 } else if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1019 NestedNameSpecifier *NNS
1020 = InstantiateNestedNameSpecifier(DTN->getQualifier(),
1021 /*FIXME=*/SourceRange(Loc),
Douglas Gregor7e063902009-05-11 23:53:27 +00001022 TemplateArgs);
Douglas Gregorde650ae2009-03-31 18:38:02 +00001023
1024 if (!NNS) // FIXME: Not the best recovery strategy.
1025 return Name;
1026
1027 if (NNS->isDependent())
1028 return Context.getDependentTemplateName(NNS, DTN->getName());
1029
1030 // Somewhat redundant with ActOnDependentTemplateName.
1031 CXXScopeSpec SS;
1032 SS.setRange(SourceRange(Loc));
1033 SS.setScopeRep(NNS);
1034 TemplateTy Template;
1035 TemplateNameKind TNK = isTemplateName(*DTN->getName(), 0, Template, &SS);
1036 if (TNK == TNK_Non_template) {
1037 Diag(Loc, diag::err_template_kw_refers_to_non_template)
1038 << DTN->getName();
1039 return Name;
1040 } else if (TNK == TNK_Function_template) {
1041 Diag(Loc, diag::err_template_kw_refers_to_non_template)
1042 << DTN->getName();
1043 return Name;
1044 }
1045
1046 return Template.getAsVal<TemplateName>();
1047 }
1048
1049
1050
Mike Stump390b4cc2009-05-16 07:39:55 +00001051 // FIXME: Even if we're referring to a Decl that isn't a template template
1052 // parameter, we may need to instantiate the outer contexts of that
1053 // Decl. However, this won't be needed until we implement member templates.
Douglas Gregorde650ae2009-03-31 18:38:02 +00001054 return Name;
1055}