forked from OSchip/llvm-project
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:
parent
2c287ec9c5
commit
04100943da
|
@ -4017,6 +4017,14 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS,
|
||||||
assert(!R.empty() && "empty lookup results when building templateid");
|
assert(!R.empty() && "empty lookup results when building templateid");
|
||||||
assert(!R.isAmbiguous() && "ambiguous lookup 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 {
|
auto AnyDependentArguments = [&]() -> bool {
|
||||||
bool InstantiationDependent;
|
bool InstantiationDependent;
|
||||||
return TemplateArgs &&
|
return TemplateArgs &&
|
||||||
|
|
|
@ -379,3 +379,19 @@ int main() {
|
||||||
|
|
||||||
} // end ns PR24473
|
} // end ns PR24473
|
||||||
#endif // CPP1Y
|
#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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue