On 08/25/2014 03:15 PM, Ville Voutilainen wrote:
Another ICE

Fixed:

Jason


commit 351ac0a147cbfe01e4f8b13a79432d3f37f42caa
Author: Jason Merrill <ja...@redhat.com>
Date:   Mon Aug 25 20:29:21 2014 -0400

    	* pt.c (check_explicit_specialization): Don't complain about
    	non-template variable.
    	(template_for_substitution): Allow variable templates.
    	(check_template_variable): Fix logic for member var template.
    	* decl.c (start_decl): Don't complain about extra template header
    	here.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 80696dd..d03f8a4 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -4672,14 +4672,6 @@ start_decl (const cp_declarator *declarator,
 		    }
 		  field = DECL_TEMPLATE_RESULT (field);
 		}
-	      else if (this_tmpl)
-		{
-		  error_at (DECL_SOURCE_LOCATION (decl),
-			    "member template declaration of %qD", decl);
-		  inform (DECL_SOURCE_LOCATION (field), "does not match "
-			  "non-member-template declaration here");
-		  return error_mark_node;
-		}
 
 	      if (DECL_CONTEXT (field) != context)
 		{
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 3e6d777..59df387 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -2308,7 +2308,8 @@ check_template_variable (tree decl)
 {
   tree ctx = CP_DECL_CONTEXT (decl);
   int wanted = num_template_headers_for_class (ctx);
-  if (!TYPE_P (ctx) || !CLASSTYPE_TEMPLATE_INFO (ctx))
+  if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
+      && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl)))
     {
       if (cxx_dialect < cxx14)
         pedwarn (DECL_SOURCE_LOCATION (decl), 0,
@@ -2323,7 +2324,8 @@ check_template_variable (tree decl)
       bool warned = pedwarn (DECL_SOURCE_LOCATION (decl), 0,
 			     "too many template headers for %D (should be %d)",
 			     decl, wanted);
-      if (warned && CLASSTYPE_TEMPLATE_SPECIALIZATION (ctx))
+      if (warned && CLASS_TYPE_P (ctx)
+	  && CLASSTYPE_TEMPLATE_SPECIALIZATION (ctx))
 	inform (DECL_SOURCE_LOCATION (decl),
 		"members of an explicitly specialized class are defined "
 		"without a template header");
@@ -2451,11 +2453,9 @@ check_explicit_specialization (tree declarator,
       /* Fall through.  */
     case tsk_expl_spec:
       if (VAR_P (decl) && TREE_CODE (declarator) != TEMPLATE_ID_EXPR)
-        {
-           // In cases like template<> constexpr bool v = true;
-           error ("%qD is not a template variable", dname);
-           break;
-        }
+	/* In cases like template<> constexpr bool v = true;
+	   We'll give an error in check_template_variable.  */
+	break;
 
       SET_DECL_TEMPLATE_SPECIALIZATION (decl);
       if (ctype)
@@ -19711,8 +19711,6 @@ template_for_substitution (tree decl)
 	 cannot restructure the loop to just keep going until we find
 	 a template with a definition, since that might go too far if
 	 a specialization was declared, but not defined.  */
-      gcc_assert (!VAR_P (decl)
-		  || DECL_IN_AGGR_P (DECL_TEMPLATE_RESULT (tmpl)));
 
       /* Fetch the more general template.  */
       tmpl = DECL_TI_TEMPLATE (tmpl);
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ10.C b/gcc/testsuite/g++.dg/cpp1y/var-templ10.C
new file mode 100644
index 0000000..ece2eb2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ10.C
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++14 } }
+
+template <class T>
+struct Y
+{
+  template <class U> static U x;
+};
+
+template <class T>
+template <class U>
+U Y<T>::x = U();
+
+int main()
+{
+  int y = Y<int>::x<int>;
+}

Reply via email to