forked from OSchip/llvm-project
Explain that a template needs arguments to make it into a type, for
variable declarations. llvm-svn: 100809
This commit is contained in:
parent
433d40695b
commit
54eba427ed
|
@ -275,6 +275,24 @@ bool Sema::DiagnoseUnknownTypeName(const IdentifierInfo &II,
|
|||
}
|
||||
}
|
||||
|
||||
if (getLangOptions().CPlusPlus) {
|
||||
// See if II is a class template that the user forgot to pass arguments to.
|
||||
UnqualifiedId Name;
|
||||
Name.setIdentifier(&II, IILoc);
|
||||
CXXScopeSpec EmptySS;
|
||||
TemplateTy TemplateResult;
|
||||
if (isTemplateName(S, SS ? *SS : EmptySS, Name, 0, true, TemplateResult)
|
||||
== TNK_Type_template) {
|
||||
TemplateName TplName = TemplateResult.getAsVal<TemplateName>();
|
||||
Diag(IILoc, diag::err_template_missing_args) << TplName;
|
||||
if (TemplateDecl *TplDecl = TplName.getAsTemplateDecl()) {
|
||||
Diag(TplDecl->getLocation(), diag::note_template_decl_here)
|
||||
<< TplDecl->getTemplateParameters()->getSourceRange();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Should we move the logic that tries to recover from a missing tag
|
||||
// (struct, union, enum) from Parser::ParseImplicitInt here, instead?
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
template<typename T,
|
||||
int I,
|
||||
template<typename> class TT>
|
||||
class A; // expected-note 2 {{template is declared here}}
|
||||
class A; // expected-note 3 {{template is declared here}}
|
||||
|
||||
template<typename> class X;
|
||||
|
||||
|
@ -10,6 +10,7 @@ A<int, 0, X> * a1;
|
|||
|
||||
A<float, 1, X, double> *a2; // expected-error{{too many template arguments for class template 'A'}}
|
||||
A<float, 1> *a3; // expected-error{{too few template arguments for class template 'A'}}
|
||||
A a3; // expected-error{{use of class template A requires template arguments}}
|
||||
|
||||
namespace test0 {
|
||||
template <class t> class foo {};
|
||||
|
|
Loading…
Reference in New Issue