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
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 442a8ec..788eaca 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -4017,6 +4017,14 @@
   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 &&
diff --git a/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp b/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
index 6471cd8..2e1c9a4 100644
--- a/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
+++ b/clang/test/SemaCXX/cxx1y-variable-templates_in_class.cpp
@@ -379,3 +379,19 @@
 
 } // 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
+}