blob: c0c6e23baf6705a525326e44abdd868d380fec29 [file] [log] [blame]
Douglas Gregordd861062008-12-05 18:15:24 +00001//===------- SemaTemplate.cpp - Semantic Analysis for C++ Templates -------===/
2
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//+//===----------------------------------------------------------------------===/
9
10//
11// This file implements semantic analysis for C++ templates.
12//+//===----------------------------------------------------------------------===/
13
14#include "Sema.h"
Douglas Gregord406b032009-02-06 22:42:48 +000015#include "clang/AST/ASTContext.h"
Douglas Gregor1b21c7f2008-12-05 23:32:09 +000016#include "clang/AST/Expr.h"
Douglas Gregor279272e2009-02-04 19:02:06 +000017#include "clang/AST/DeclTemplate.h"
Douglas Gregordd861062008-12-05 18:15:24 +000018#include "clang/Parse/DeclSpec.h"
19#include "clang/Basic/LangOptions.h"
20
21using namespace clang;
22
Douglas Gregor2fa10442008-12-18 19:37:40 +000023/// isTemplateName - Determines whether the identifier II is a
24/// template name in the current scope, and returns the template
25/// declaration if II names a template. An optional CXXScope can be
26/// passed to indicate the C++ scope in which the identifier will be
27/// found.
Douglas Gregor8e458f42009-02-09 18:46:07 +000028Sema::TemplateNameKind Sema::isTemplateName(IdentifierInfo &II, Scope *S,
29 DeclTy *&Template,
30 const CXXScopeSpec *SS) {
Douglas Gregor09be81b2009-02-04 17:27:36 +000031 NamedDecl *IIDecl = LookupParsedName(S, SS, &II, LookupOrdinaryName);
Douglas Gregor2fa10442008-12-18 19:37:40 +000032
33 if (IIDecl) {
Douglas Gregor8e458f42009-02-09 18:46:07 +000034 if (isa<TemplateDecl>(IIDecl)) {
35 Template = IIDecl;
36 if (isa<FunctionTemplateDecl>(IIDecl))
37 return TNK_Function_template;
38 else if (isa<ClassTemplateDecl>(IIDecl))
39 return TNK_Class_template;
40 else if (isa<TemplateTemplateParmDecl>(IIDecl))
41 return TNK_Template_template_parm;
42 else
43 assert(false && "Unknown TemplateDecl");
44 }
Douglas Gregor279272e2009-02-04 19:02:06 +000045
Douglas Gregor8e458f42009-02-09 18:46:07 +000046 // FIXME: What follows is a gross hack.
Douglas Gregor2fa10442008-12-18 19:37:40 +000047 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(IIDecl)) {
Douglas Gregor8e458f42009-02-09 18:46:07 +000048 if (FD->getType()->isDependentType()) {
49 Template = FD;
50 return TNK_Function_template;
51 }
Douglas Gregor2fa10442008-12-18 19:37:40 +000052 } else if (OverloadedFunctionDecl *Ovl
53 = dyn_cast<OverloadedFunctionDecl>(IIDecl)) {
54 for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(),
55 FEnd = Ovl->function_end();
56 F != FEnd; ++F) {
Douglas Gregor8e458f42009-02-09 18:46:07 +000057 if ((*F)->getType()->isDependentType()) {
58 Template = Ovl;
59 return TNK_Function_template;
60 }
Douglas Gregor2fa10442008-12-18 19:37:40 +000061 }
62 }
Douglas Gregor2fa10442008-12-18 19:37:40 +000063 }
Douglas Gregor8e458f42009-02-09 18:46:07 +000064 return TNK_Non_template;
Douglas Gregor2fa10442008-12-18 19:37:40 +000065}
66
Douglas Gregordd861062008-12-05 18:15:24 +000067/// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining
68/// that the template parameter 'PrevDecl' is being shadowed by a new
69/// declaration at location Loc. Returns true to indicate that this is
70/// an error, and false otherwise.
71bool Sema::DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl) {
Douglas Gregor2715a1f2008-12-08 18:40:42 +000072 assert(PrevDecl->isTemplateParameter() && "Not a template parameter");
Douglas Gregordd861062008-12-05 18:15:24 +000073
74 // Microsoft Visual C++ permits template parameters to be shadowed.
75 if (getLangOptions().Microsoft)
76 return false;
77
78 // C++ [temp.local]p4:
79 // A template-parameter shall not be redeclared within its
80 // scope (including nested scopes).
81 Diag(Loc, diag::err_template_param_shadow)
82 << cast<NamedDecl>(PrevDecl)->getDeclName();
83 Diag(PrevDecl->getLocation(), diag::note_template_param_here);
84 return true;
85}
86
Douglas Gregor279272e2009-02-04 19:02:06 +000087/// AdjustDeclForTemplates - If the given decl happens to be a template, reset
88/// the parameter D to reference the templated declaration and return a pointer
89/// to the template declaration. Otherwise, do nothing to D and return null.
90TemplateDecl *Sema::AdjustDeclIfTemplate(DeclTy *&D)
91{
92 if(TemplateDecl *Temp = dyn_cast<TemplateDecl>(static_cast<Decl*>(D))) {
93 D = Temp->getTemplatedDecl();
94 return Temp;
95 }
96 return 0;
97}
98
Douglas Gregordd861062008-12-05 18:15:24 +000099/// ActOnTypeParameter - Called when a C++ template type parameter
100/// (e.g., "typename T") has been parsed. Typename specifies whether
101/// the keyword "typename" was used to declare the type parameter
102/// (otherwise, "class" was used), and KeyLoc is the location of the
103/// "class" or "typename" keyword. ParamName is the name of the
104/// parameter (NULL indicates an unnamed template parameter) and
105/// ParamName is the location of the parameter name (if any).
106/// If the type parameter has a default argument, it will be added
107/// later via ActOnTypeParameterDefault.
108Sema::DeclTy *Sema::ActOnTypeParameter(Scope *S, bool Typename,
109 SourceLocation KeyLoc,
110 IdentifierInfo *ParamName,
Douglas Gregor52473432008-12-24 02:52:09 +0000111 SourceLocation ParamNameLoc,
112 unsigned Depth, unsigned Position) {
Douglas Gregordd861062008-12-05 18:15:24 +0000113 assert(S->isTemplateParamScope() &&
114 "Template type parameter not in template parameter scope!");
115 bool Invalid = false;
116
117 if (ParamName) {
Douglas Gregor09be81b2009-02-04 17:27:36 +0000118 NamedDecl *PrevDecl = LookupName(S, ParamName, LookupTagName);
Douglas Gregor2715a1f2008-12-08 18:40:42 +0000119 if (PrevDecl && PrevDecl->isTemplateParameter())
Douglas Gregordd861062008-12-05 18:15:24 +0000120 Invalid = Invalid || DiagnoseTemplateParameterShadow(ParamNameLoc,
121 PrevDecl);
122 }
123
Douglas Gregord406b032009-02-06 22:42:48 +0000124 SourceLocation Loc = ParamNameLoc;
125 if (!ParamName)
126 Loc = KeyLoc;
127
Douglas Gregordd861062008-12-05 18:15:24 +0000128 TemplateTypeParmDecl *Param
Douglas Gregord406b032009-02-06 22:42:48 +0000129 = TemplateTypeParmDecl::Create(Context, CurContext, Loc,
Douglas Gregor279272e2009-02-04 19:02:06 +0000130 Depth, Position, ParamName, Typename);
Douglas Gregordd861062008-12-05 18:15:24 +0000131 if (Invalid)
132 Param->setInvalidDecl();
133
134 if (ParamName) {
135 // Add the template parameter into the current scope.
136 S->AddDecl(Param);
137 IdResolver.AddDecl(Param);
138 }
139
140 return Param;
141}
142
143/// ActOnNonTypeTemplateParameter - Called when a C++ non-type
144/// template parameter (e.g., "int Size" in "template<int Size>
145/// class Array") has been parsed. S is the current scope and D is
146/// the parsed declarator.
Douglas Gregor52473432008-12-24 02:52:09 +0000147Sema::DeclTy *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
148 unsigned Depth,
149 unsigned Position) {
Douglas Gregordd861062008-12-05 18:15:24 +0000150 QualType T = GetTypeForDeclarator(D, S);
151
Douglas Gregor279272e2009-02-04 19:02:06 +0000152 assert(S->isTemplateParamScope() &&
153 "Non-type template parameter not in template parameter scope!");
Douglas Gregordd861062008-12-05 18:15:24 +0000154 bool Invalid = false;
155
156 IdentifierInfo *ParamName = D.getIdentifier();
157 if (ParamName) {
Douglas Gregor09be81b2009-02-04 17:27:36 +0000158 NamedDecl *PrevDecl = LookupName(S, ParamName, LookupTagName);
Douglas Gregor2715a1f2008-12-08 18:40:42 +0000159 if (PrevDecl && PrevDecl->isTemplateParameter())
Douglas Gregordd861062008-12-05 18:15:24 +0000160 Invalid = Invalid || DiagnoseTemplateParameterShadow(D.getIdentifierLoc(),
Douglas Gregor279272e2009-02-04 19:02:06 +0000161 PrevDecl);
Douglas Gregordd861062008-12-05 18:15:24 +0000162 }
163
Douglas Gregor62cdc792009-02-10 17:43:50 +0000164 // C++ [temp.param]p4:
165 //
166 // A non-type template-parameter shall have one of the following
167 // (optionally cv-qualified) types:
168 //
169 // -- integral or enumeration type,
170 if (T->isIntegralType() || T->isEnumeralType() ||
171 // -- pointer to object or pointer to function,
172 T->isPointerType() ||
173 // -- reference to object or reference to function,
174 T->isReferenceType() ||
175 // -- pointer to member.
176 T->isMemberPointerType() ||
177 // If T is a dependent type, we can't do the check now, so we
178 // assume that it is well-formed.
179 T->isDependentType()) {
180 // Okay: The template parameter is well-formed.
181 }
182 // C++ [temp.param]p8:
183 //
184 // A non-type template-parameter of type "array of T" or
185 // "function returning T" is adjusted to be of type "pointer to
186 // T" or "pointer to function returning T", respectively.
187 else if (T->isArrayType())
188 // FIXME: Keep the type prior to promotion?
189 T = Context.getArrayDecayedType(T);
190 else if (T->isFunctionType())
191 // FIXME: Keep the type prior to promotion?
192 T = Context.getPointerType(T);
193 else {
194 Diag(D.getIdentifierLoc(), diag::err_template_nontype_parm_bad_type)
195 << T;
196 return 0;
197 }
198
Douglas Gregordd861062008-12-05 18:15:24 +0000199 NonTypeTemplateParmDecl *Param
200 = NonTypeTemplateParmDecl::Create(Context, CurContext, D.getIdentifierLoc(),
Douglas Gregor279272e2009-02-04 19:02:06 +0000201 Depth, Position, ParamName, T);
Douglas Gregordd861062008-12-05 18:15:24 +0000202 if (Invalid)
203 Param->setInvalidDecl();
204
205 if (D.getIdentifier()) {
206 // Add the template parameter into the current scope.
207 S->AddDecl(Param);
208 IdResolver.AddDecl(Param);
209 }
210 return Param;
211}
Douglas Gregor52473432008-12-24 02:52:09 +0000212
Douglas Gregor279272e2009-02-04 19:02:06 +0000213
214/// ActOnTemplateTemplateParameter - Called when a C++ template template
215/// parameter (e.g. T in template <template <typename> class T> class array)
216/// has been parsed. S is the current scope.
217Sema::DeclTy *Sema::ActOnTemplateTemplateParameter(Scope* S,
218 SourceLocation TmpLoc,
219 TemplateParamsTy *Params,
220 IdentifierInfo *Name,
221 SourceLocation NameLoc,
222 unsigned Depth,
223 unsigned Position)
224{
225 assert(S->isTemplateParamScope() &&
226 "Template template parameter not in template parameter scope!");
227
228 // Construct the parameter object.
229 TemplateTemplateParmDecl *Param =
230 TemplateTemplateParmDecl::Create(Context, CurContext, TmpLoc, Depth,
231 Position, Name,
232 (TemplateParameterList*)Params);
233
234 // Make sure the parameter is valid.
235 // FIXME: Decl object is not currently invalidated anywhere so this doesn't
236 // do anything yet. However, if the template parameter list or (eventual)
237 // default value is ever invalidated, that will propagate here.
238 bool Invalid = false;
239 if (Invalid) {
240 Param->setInvalidDecl();
241 }
242
243 // If the tt-param has a name, then link the identifier into the scope
244 // and lookup mechanisms.
245 if (Name) {
246 S->AddDecl(Param);
247 IdResolver.AddDecl(Param);
248 }
249
250 return Param;
251}
252
Douglas Gregor52473432008-12-24 02:52:09 +0000253/// ActOnTemplateParameterList - Builds a TemplateParameterList that
254/// contains the template parameters in Params/NumParams.
255Sema::TemplateParamsTy *
256Sema::ActOnTemplateParameterList(unsigned Depth,
257 SourceLocation ExportLoc,
258 SourceLocation TemplateLoc,
259 SourceLocation LAngleLoc,
260 DeclTy **Params, unsigned NumParams,
261 SourceLocation RAngleLoc) {
262 if (ExportLoc.isValid())
263 Diag(ExportLoc, diag::note_template_export_unsupported);
264
Douglas Gregord406b032009-02-06 22:42:48 +0000265 return TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc,
266 (Decl**)Params, NumParams, RAngleLoc);
Douglas Gregor52473432008-12-24 02:52:09 +0000267}
Douglas Gregor279272e2009-02-04 19:02:06 +0000268
Douglas Gregord406b032009-02-06 22:42:48 +0000269Sema::DeclTy *
270Sema::ActOnClassTemplate(Scope *S, unsigned TagSpec, TagKind TK,
271 SourceLocation KWLoc, const CXXScopeSpec &SS,
272 IdentifierInfo *Name, SourceLocation NameLoc,
273 AttributeList *Attr,
274 MultiTemplateParamsArg TemplateParameterLists) {
275 assert(TemplateParameterLists.size() > 0 && "No template parameter lists?");
276 assert(TK != TK_Reference && "Can only declare or define class templates");
277
278 // Check that we can declare a template here.
279 if (CheckTemplateDeclScope(S, TemplateParameterLists))
280 return 0;
281
282 TagDecl::TagKind Kind;
283 switch (TagSpec) {
284 default: assert(0 && "Unknown tag type!");
285 case DeclSpec::TST_struct: Kind = TagDecl::TK_struct; break;
286 case DeclSpec::TST_union: Kind = TagDecl::TK_union; break;
287 case DeclSpec::TST_class: Kind = TagDecl::TK_class; break;
288 }
289
290 // There is no such thing as an unnamed class template.
291 if (!Name) {
292 Diag(KWLoc, diag::err_template_unnamed_class);
293 return 0;
294 }
295
296 // Find any previous declaration with this name.
297 LookupResult Previous = LookupParsedName(S, &SS, Name, LookupOrdinaryName,
298 true);
299 assert(!Previous.isAmbiguous() && "Ambiguity in class template redecl?");
300 NamedDecl *PrevDecl = 0;
301 if (Previous.begin() != Previous.end())
302 PrevDecl = *Previous.begin();
303
304 DeclContext *SemanticContext = CurContext;
305 if (SS.isNotEmpty() && !SS.isInvalid()) {
306 SemanticContext = static_cast<DeclContext*>(SS.getScopeRep());
307
308 // FIXME: need to match up several levels of template parameter
309 // lists here.
310 }
311
312 // FIXME: member templates!
313 TemplateParameterList *TemplateParams
314 = static_cast<TemplateParameterList *>(*TemplateParameterLists.release());
315
316 // If there is a previous declaration with the same name, check
317 // whether this is a valid redeclaration.
318 ClassTemplateDecl *PrevClassTemplate
319 = dyn_cast_or_null<ClassTemplateDecl>(PrevDecl);
320 if (PrevClassTemplate) {
321 // Ensure that the template parameter lists are compatible.
322 if (!TemplateParameterListsAreEqual(TemplateParams,
323 PrevClassTemplate->getTemplateParameters(),
324 /*Complain=*/true))
325 return 0;
326
327 // C++ [temp.class]p4:
328 // In a redeclaration, partial specialization, explicit
329 // specialization or explicit instantiation of a class template,
330 // the class-key shall agree in kind with the original class
331 // template declaration (7.1.5.3).
332 RecordDecl *PrevRecordDecl = PrevClassTemplate->getTemplatedDecl();
333 if (PrevRecordDecl->getTagKind() != Kind) {
334 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
335 Diag(PrevRecordDecl->getLocation(), diag::note_previous_use);
336 return 0;
337 }
338
339
340 // Check for redefinition of this class template.
341 if (TK == TK_Definition) {
342 if (TagDecl *Def = PrevRecordDecl->getDefinition(Context)) {
343 Diag(NameLoc, diag::err_redefinition) << Name;
344 Diag(Def->getLocation(), diag::note_previous_definition);
345 // FIXME: Would it make sense to try to "forget" the previous
346 // definition, as part of error recovery?
347 return 0;
348 }
349 }
350 } else if (PrevDecl && PrevDecl->isTemplateParameter()) {
351 // Maybe we will complain about the shadowed template parameter.
352 DiagnoseTemplateParameterShadow(NameLoc, PrevDecl);
353 // Just pretend that we didn't see the previous declaration.
354 PrevDecl = 0;
355 } else if (PrevDecl) {
356 // C++ [temp]p5:
357 // A class template shall not have the same name as any other
358 // template, class, function, object, enumeration, enumerator,
359 // namespace, or type in the same scope (3.3), except as specified
360 // in (14.5.4).
361 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
362 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
363 return 0;
364 }
365
366 // If we had a scope specifier, we better have a previous template
367 // declaration!
368
369 TagDecl *NewClass =
370 CXXRecordDecl::Create(Context, Kind, SemanticContext, NameLoc, Name,
371 PrevClassTemplate?
372 PrevClassTemplate->getTemplatedDecl() : 0);
373
374 ClassTemplateDecl *NewTemplate
375 = ClassTemplateDecl::Create(Context, SemanticContext, NameLoc,
376 DeclarationName(Name), TemplateParams,
377 NewClass);
378
379 // Set the lexical context of these templates
380 NewClass->setLexicalDeclContext(CurContext);
381 NewTemplate->setLexicalDeclContext(CurContext);
382
383 if (TK == TK_Definition)
384 NewClass->startDefinition();
385
386 if (Attr)
387 ProcessDeclAttributeList(NewClass, Attr);
388
389 PushOnScopeChains(NewTemplate, S);
390
391 return NewTemplate;
392}
393
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000394
395
Douglas Gregor8e458f42009-02-09 18:46:07 +0000396Action::TypeTy *
397Sema::ActOnClassTemplateSpecialization(DeclTy *TemplateD,
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000398 SourceLocation TemplateLoc,
Douglas Gregor8e458f42009-02-09 18:46:07 +0000399 SourceLocation LAngleLoc,
Douglas Gregor6f37b582009-02-09 19:34:22 +0000400 ASTTemplateArgsPtr TemplateArgs,
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000401 SourceLocation *TemplateArgLocs,
Douglas Gregor8e458f42009-02-09 18:46:07 +0000402 SourceLocation RAngleLoc,
403 const CXXScopeSpec *SS) {
404 TemplateDecl *Template = cast<TemplateDecl>(static_cast<Decl *>(TemplateD));
405
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000406 // Check that the template argument list is well-formed for this
407 // template.
408 if (!CheckTemplateArgumentList(Template, TemplateLoc, LAngleLoc,
409 TemplateArgs, TemplateArgLocs, RAngleLoc))
410 return 0;
411
Douglas Gregor8e458f42009-02-09 18:46:07 +0000412 // Yes, all class template specializations are just silly sugar for
413 // 'int'. Gotta problem wit dat?
Douglas Gregor6f37b582009-02-09 19:34:22 +0000414 QualType Result
415 = Context.getClassTemplateSpecializationType(Template,
416 TemplateArgs.size(),
417 reinterpret_cast<uintptr_t *>(TemplateArgs.getArgs()),
418 TemplateArgs.getArgIsType(),
419 Context.IntTy);
420 TemplateArgs.release();
421 return Result.getAsOpaquePtr();
Douglas Gregor8e458f42009-02-09 18:46:07 +0000422}
423
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000424/// \brief Check that the given template argument list is well-formed
425/// for specializing the given template.
426bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
427 SourceLocation TemplateLoc,
428 SourceLocation LAngleLoc,
429 ASTTemplateArgsPtr& Args,
430 SourceLocation *TemplateArgLocs,
431 SourceLocation RAngleLoc) {
432 TemplateParameterList *Params = Template->getTemplateParameters();
433 unsigned NumParams = Params->size();
434 unsigned NumArgs = Args.size();
435 bool Invalid = false;
436
437 if (NumArgs > NumParams ||
438 NumArgs < NumParams /*FIXME: default arguments! */) {
439 // FIXME: point at either the first arg beyond what we can handle,
440 // or the '>', depending on whether we have too many or too few
441 // arguments.
442 SourceRange Range;
443 if (NumArgs > NumParams)
444 Range = SourceRange(TemplateArgLocs[NumParams], RAngleLoc);
445 Diag(TemplateLoc, diag::err_template_arg_list_different_arity)
446 << (NumArgs > NumParams)
447 << (isa<ClassTemplateDecl>(Template)? 0 :
448 isa<FunctionTemplateDecl>(Template)? 1 :
449 isa<TemplateTemplateParmDecl>(Template)? 2 : 3)
450 << Template << Range;
451
452 Invalid = true;
453 }
454
455 // C++ [temp.arg]p1:
456 // [...] The type and form of each template-argument specified in
457 // a template-id shall match the type and form specified for the
458 // corresponding parameter declared by the template in its
459 // template-parameter-list.
460 unsigned ArgIdx = 0;
461 for (TemplateParameterList::iterator Param = Params->begin(),
462 ParamEnd = Params->end();
463 Param != ParamEnd; ++Param, ++ArgIdx) {
464 // Decode the template argument
465 QualType ArgType;
466 Expr *ArgExpr = 0;
467 SourceLocation ArgLoc;
468 if (ArgIdx >= NumArgs) {
469 // FIXME: Get the default argument here, which might
470 // (eventually) require instantiation.
471 break;
472 } else
473 ArgLoc = TemplateArgLocs[ArgIdx];
474
475 if (Args.getArgIsType()[ArgIdx])
476 ArgType = QualType::getFromOpaquePtr(Args.getArgs()[ArgIdx]);
477 else
478 ArgExpr = reinterpret_cast<Expr *>(Args.getArgs()[ArgIdx]);
479
480 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
481 // Check template type parameters.
482 if (!ArgType.isNull()) {
483 if (!CheckTemplateArgument(TTP, ArgType, ArgLoc))
484 Invalid = true;
485 continue;
486 }
487
488 // C++ [temp.arg.type]p1:
489 // A template-argument for a template-parameter which is a
490 // type shall be a type-id.
491
492 // We have a template type parameter but the template argument
493 // is an expression.
494 Diag(ArgExpr->getSourceRange().getBegin(),
495 diag::err_template_arg_must_be_type);
Douglas Gregor341ac792009-02-10 00:53:15 +0000496 Diag((*Param)->getLocation(), diag::note_template_param_here);
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000497 Invalid = true;
498 } else if (NonTypeTemplateParmDecl *NTTP
499 = dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
500 // Check non-type template parameters.
501 if (ArgExpr) {
502 if (!CheckTemplateArgument(NTTP, ArgExpr))
503 Invalid = true;
504 continue;
505 }
506
507 // We have a non-type template parameter but the template
508 // argument is a type.
509
510 // C++ [temp.arg]p2:
511 // In a template-argument, an ambiguity between a type-id and
512 // an expression is resolved to a type-id, regardless of the
513 // form of the corresponding template-parameter.
514 //
515 // We warn specifically about this case, since it can be rather
516 // confusing for users.
517 if (ArgType->isFunctionType())
518 Diag(ArgLoc, diag::err_template_arg_nontype_ambig)
519 << ArgType;
520 else
521 Diag(ArgLoc, diag::err_template_arg_must_be_expr);
Douglas Gregor341ac792009-02-10 00:53:15 +0000522 Diag((*Param)->getLocation(), diag::note_template_param_here);
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000523 Invalid = true;
524 } else {
525 // Check template template parameters.
526 TemplateTemplateParmDecl *TempParm
527 = cast<TemplateTemplateParmDecl>(*Param);
528
529 if (ArgExpr && isa<DeclRefExpr>(ArgExpr) &&
530 isa<TemplateDecl>(cast<DeclRefExpr>(ArgExpr)->getDecl())) {
531 if (!CheckTemplateArgument(TempParm, cast<DeclRefExpr>(ArgExpr)))
532 Invalid = true;
533 continue;
534 }
535
536 // We have a template template parameter but the template
537 // argument does not refer to a template.
538 Diag(ArgLoc, diag::err_template_arg_must_be_template);
539 Invalid = true;
540 }
541 }
542
543 return Invalid;
544}
545
546/// \brief Check a template argument against its corresponding
547/// template type parameter.
548///
549/// This routine implements the semantics of C++ [temp.arg.type]. It
550/// returns true if an error occurred, and false otherwise.
551bool Sema::CheckTemplateArgument(TemplateTypeParmDecl *Param,
552 QualType Arg, SourceLocation ArgLoc) {
553 // C++ [temp.arg.type]p2:
554 // A local type, a type with no linkage, an unnamed type or a type
555 // compounded from any of these types shall not be used as a
556 // template-argument for a template type-parameter.
557 //
558 // FIXME: Perform the recursive and no-linkage type checks.
559 const TagType *Tag = 0;
560 if (const EnumType *EnumT = Arg->getAsEnumType())
561 Tag = EnumT;
562 else if (const RecordType *RecordT = Arg->getAsRecordType())
563 Tag = RecordT;
564 if (Tag && Tag->getDecl()->getDeclContext()->isFunctionOrMethod())
565 return Diag(ArgLoc, diag::err_template_arg_local_type)
566 << QualType(Tag, 0);
567 else if (Tag && !Tag->getDecl()->getDeclName()) {
568 Diag(ArgLoc, diag::err_template_arg_unnamed_type);
569 Diag(Tag->getDecl()->getLocation(), diag::note_template_unnamed_type_here);
570 return true;
571 }
572
573 return false;
574}
575
576/// \brief Check a template argument against its corresponding
577/// non-type template parameter.
578///
579/// This routine implements the semantics of C++ [temp.arg.nontype].
580/// It returns true if an error occurred, and false otherwise.
581bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
582 Expr *Arg) {
583 return false;
584}
585
586/// \brief Check a template argument against its corresponding
587/// template template parameter.
588///
589/// This routine implements the semantics of C++ [temp.arg.template].
590/// It returns true if an error occurred, and false otherwise.
591bool Sema::CheckTemplateArgument(TemplateTemplateParmDecl *Param,
592 DeclRefExpr *Arg) {
Douglas Gregore8e367f2009-02-10 00:24:35 +0000593 assert(isa<TemplateDecl>(Arg->getDecl()) && "Only template decls allowed");
594 TemplateDecl *Template = cast<TemplateDecl>(Arg->getDecl());
595
596 // C++ [temp.arg.template]p1:
597 // A template-argument for a template template-parameter shall be
598 // the name of a class template, expressed as id-expression. Only
599 // primary class templates are considered when matching the
600 // template template argument with the corresponding parameter;
601 // partial specializations are not considered even if their
602 // parameter lists match that of the template template parameter.
603 if (!isa<ClassTemplateDecl>(Template)) {
604 assert(isa<FunctionTemplateDecl>(Template) &&
605 "Only function templates are possible here");
606 Diag(Arg->getSourceRange().getBegin(), diag::note_template_arg_refers_here)
607 << Template;
608 }
609
610 return !TemplateParameterListsAreEqual(Template->getTemplateParameters(),
611 Param->getTemplateParameters(),
612 true, true,
613 Arg->getSourceRange().getBegin());
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000614}
615
Douglas Gregord406b032009-02-06 22:42:48 +0000616/// \brief Determine whether the given template parameter lists are
617/// equivalent.
618///
619/// \param New The new template parameter list, typically written in the
620/// source code as part of a new template declaration.
621///
622/// \param Old The old template parameter list, typically found via
623/// name lookup of the template declared with this template parameter
624/// list.
625///
626/// \param Complain If true, this routine will produce a diagnostic if
627/// the template parameter lists are not equivalent.
628///
Douglas Gregore8e367f2009-02-10 00:24:35 +0000629/// \param IsTemplateTemplateParm If true, this routine is being
630/// called to compare the template parameter lists of a template
631/// template parameter.
632///
633/// \param TemplateArgLoc If this source location is valid, then we
634/// are actually checking the template parameter list of a template
635/// argument (New) against the template parameter list of its
636/// corresponding template template parameter (Old). We produce
637/// slightly different diagnostics in this scenario.
638///
Douglas Gregord406b032009-02-06 22:42:48 +0000639/// \returns True if the template parameter lists are equal, false
640/// otherwise.
641bool
642Sema::TemplateParameterListsAreEqual(TemplateParameterList *New,
643 TemplateParameterList *Old,
644 bool Complain,
Douglas Gregore8e367f2009-02-10 00:24:35 +0000645 bool IsTemplateTemplateParm,
646 SourceLocation TemplateArgLoc) {
Douglas Gregord406b032009-02-06 22:42:48 +0000647 if (Old->size() != New->size()) {
648 if (Complain) {
Douglas Gregore8e367f2009-02-10 00:24:35 +0000649 unsigned NextDiag = diag::err_template_param_list_different_arity;
650 if (TemplateArgLoc.isValid()) {
651 Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
652 NextDiag = diag::note_template_param_list_different_arity;
653 }
654 Diag(New->getTemplateLoc(), NextDiag)
655 << (New->size() > Old->size())
656 << IsTemplateTemplateParm
657 << SourceRange(New->getTemplateLoc(), New->getRAngleLoc());
Douglas Gregord406b032009-02-06 22:42:48 +0000658 Diag(Old->getTemplateLoc(), diag::note_template_prev_declaration)
659 << IsTemplateTemplateParm
660 << SourceRange(Old->getTemplateLoc(), Old->getRAngleLoc());
661 }
662
663 return false;
664 }
665
666 for (TemplateParameterList::iterator OldParm = Old->begin(),
667 OldParmEnd = Old->end(), NewParm = New->begin();
668 OldParm != OldParmEnd; ++OldParm, ++NewParm) {
669 if ((*OldParm)->getKind() != (*NewParm)->getKind()) {
Douglas Gregore8e367f2009-02-10 00:24:35 +0000670 unsigned NextDiag = diag::err_template_param_different_kind;
671 if (TemplateArgLoc.isValid()) {
672 Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
673 NextDiag = diag::note_template_param_different_kind;
674 }
675 Diag((*NewParm)->getLocation(), NextDiag)
Douglas Gregord406b032009-02-06 22:42:48 +0000676 << IsTemplateTemplateParm;
677 Diag((*OldParm)->getLocation(), diag::note_template_prev_declaration)
678 << IsTemplateTemplateParm;
679 return false;
680 }
681
682 if (isa<TemplateTypeParmDecl>(*OldParm)) {
683 // Okay; all template type parameters are equivalent (since we
Douglas Gregore8e367f2009-02-10 00:24:35 +0000684 // know we're at the same index).
685#if 0
686 // FIXME: Enable this code in debug mode *after* we properly go
687 // through and "instantiate" the template parameter lists of
688 // template template parameters. It's only after this
689 // instantiation that (1) any dependent types within the
690 // template parameter list of the template template parameter
691 // can be checked, and (2) the template type parameter depths
692 // will match up.
Douglas Gregord406b032009-02-06 22:42:48 +0000693 QualType OldParmType
694 = Context.getTypeDeclType(cast<TemplateTypeParmDecl>(*OldParm));
695 QualType NewParmType
696 = Context.getTypeDeclType(cast<TemplateTypeParmDecl>(*NewParm));
697 assert(Context.getCanonicalType(OldParmType) ==
698 Context.getCanonicalType(NewParmType) &&
699 "type parameter mismatch?");
700#endif
701 } else if (NonTypeTemplateParmDecl *OldNTTP
702 = dyn_cast<NonTypeTemplateParmDecl>(*OldParm)) {
703 // The types of non-type template parameters must agree.
704 NonTypeTemplateParmDecl *NewNTTP
705 = cast<NonTypeTemplateParmDecl>(*NewParm);
706 if (Context.getCanonicalType(OldNTTP->getType()) !=
707 Context.getCanonicalType(NewNTTP->getType())) {
708 if (Complain) {
Douglas Gregore8e367f2009-02-10 00:24:35 +0000709 unsigned NextDiag = diag::err_template_nontype_parm_different_type;
710 if (TemplateArgLoc.isValid()) {
711 Diag(TemplateArgLoc,
712 diag::err_template_arg_template_params_mismatch);
713 NextDiag = diag::note_template_nontype_parm_different_type;
714 }
715 Diag(NewNTTP->getLocation(), NextDiag)
Douglas Gregord406b032009-02-06 22:42:48 +0000716 << NewNTTP->getType()
717 << IsTemplateTemplateParm;
718 Diag(OldNTTP->getLocation(),
719 diag::note_template_nontype_parm_prev_declaration)
720 << OldNTTP->getType();
721 }
722 return false;
723 }
724 } else {
725 // The template parameter lists of template template
726 // parameters must agree.
727 // FIXME: Could we perform a faster "type" comparison here?
728 assert(isa<TemplateTemplateParmDecl>(*OldParm) &&
729 "Only template template parameters handled here");
730 TemplateTemplateParmDecl *OldTTP
731 = cast<TemplateTemplateParmDecl>(*OldParm);
732 TemplateTemplateParmDecl *NewTTP
733 = cast<TemplateTemplateParmDecl>(*NewParm);
734 if (!TemplateParameterListsAreEqual(NewTTP->getTemplateParameters(),
735 OldTTP->getTemplateParameters(),
736 Complain,
Douglas Gregore8e367f2009-02-10 00:24:35 +0000737 /*IsTemplateTemplateParm=*/true,
738 TemplateArgLoc))
Douglas Gregord406b032009-02-06 22:42:48 +0000739 return false;
740 }
741 }
742
743 return true;
744}
745
746/// \brief Check whether a template can be declared within this scope.
747///
748/// If the template declaration is valid in this scope, returns
749/// false. Otherwise, issues a diagnostic and returns true.
750bool
751Sema::CheckTemplateDeclScope(Scope *S,
752 MultiTemplateParamsArg &TemplateParameterLists) {
753 assert(TemplateParameterLists.size() > 0 && "Not a template");
754
755 // Find the nearest enclosing declaration scope.
756 while ((S->getFlags() & Scope::DeclScope) == 0 ||
757 (S->getFlags() & Scope::TemplateParamScope) != 0)
758 S = S->getParent();
759
760 TemplateParameterList *TemplateParams =
761 static_cast<TemplateParameterList*>(*TemplateParameterLists.get());
762 SourceLocation TemplateLoc = TemplateParams->getTemplateLoc();
763 SourceRange TemplateRange
764 = SourceRange(TemplateLoc, TemplateParams->getRAngleLoc());
765
766 // C++ [temp]p2:
767 // A template-declaration can appear only as a namespace scope or
768 // class scope declaration.
769 DeclContext *Ctx = static_cast<DeclContext *>(S->getEntity());
770 while (Ctx && isa<LinkageSpecDecl>(Ctx)) {
771 if (cast<LinkageSpecDecl>(Ctx)->getLanguage() != LinkageSpecDecl::lang_cxx)
772 return Diag(TemplateLoc, diag::err_template_linkage)
773 << TemplateRange;
774
775 Ctx = Ctx->getParent();
776 }
777
778 if (Ctx && (Ctx->isFileContext() || Ctx->isRecord()))
779 return false;
780
781 return Diag(TemplateLoc, diag::err_template_outside_namespace_or_class_scope)
782 << TemplateRange;
783}