Diagnose missing template arguments for a variable template even when there is

a preceding 'template' keyword.

We only diagnose in the dependent case (wherein we used to crash). Another bug
prevents the diagnostic from appearing in the non-template case.

llvm-svn: 330894
This commit is contained in:
Richard Smith 2018-04-26 02:10:22 +00:00
parent 2c287ec9c5
commit 04100943da
2 changed files with 24 additions and 0 deletions

View File

@ -4017,6 +4017,14 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS,
assert(!R.empty() && "empty lookup results when building templateid");
assert(!R.isAmbiguous() && "ambiguous lookup when building templateid");
// Non-function templates require a template argument list.
if (auto *TD = R.getAsSingle<TemplateDecl>()) {
if (!TemplateArgs && !isa<FunctionTemplateDecl>(TD)) {
diagnoseMissingTemplateArguments(TemplateName(TD), R.getNameLoc());
return ExprError();
}
}
auto AnyDependentArguments = [&]() -> bool {
bool InstantiationDependent;
return TemplateArgs &&

View File

@ -379,3 +379,19 @@ int main() {
} // end ns PR24473
#endif // CPP1Y
namespace dependent_static_var_template {
struct A {
template<int = 0> static int n; // expected-note {{here}}
};
int &r = A::template n; // FIXME: ill-formed
template<typename T>
int &f() { return T::template n; } // expected-error {{use of variable template 'n' requires template arguments}}
int &s = f<A>(); // expected-note {{instantiation of}}
namespace B {
template<int = 0> static int n;
}
int &t = B::template n; // FIXME: ill-formed
}