Author: rsmith Date: Wed Apr 25 19:10:22 2018 New Revision: 330894 URL: http://llvm.org/viewvc/llvm-project?rev=330894&view=rev Log: 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. Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=330894&r1=330893&r2=330894&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Apr 25 19:10:22 2018 @@ -4017,6 +4017,14 @@ ExprResult Sema::BuildTemplateIdExpr(con 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 && Modified: cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp?rev=330894&r1=330893&r2=330894&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp (original) +++ cfe/trunk/test/SemaCXX/cxx1y-variable-templates_in_class.cpp Wed Apr 25 19:10:22 2018 @@ -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 +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits