]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/34913 (ICE vector in template)
authorJason Merrill <jason@redhat.com>
Thu, 24 Jan 2008 14:41:32 +0000 (09:41 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 24 Jan 2008 14:41:32 +0000 (09:41 -0500)
        PR c++/34913
        * decl2.c (is_late_template_attribute): Defer any attribute with
        dependent args.  Also defer type attributes if the type is dependent.

From-SVN: r131779

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/g++.dg/ext/vector11.C [new file with mode: 0644]

index 667f813b594770100e58fc8e4794b2943b9c0199..b6593cfa04a2a053c719ffe4d75c5e8eb861eadd 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-24  Jason Merrill  <jason@redhat.com>
+
+       PR c++/34913
+       * decl2.c (is_late_template_attribute): Defer any attribute with 
+       dependent args.  Also defer type attributes if the type is dependent.
+
 2008-01-22  Jakub Jelinek  <jakub@redhat.com>, Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/33984
index 97b3ee0f3f25adf6e607c04ba35d402b49f258d1..550d0bcebab7f275eea2d4a6577a074b92dab060 100644 (file)
@@ -985,17 +985,25 @@ is_late_template_attribute (tree attr, tree decl)
   tree name = TREE_PURPOSE (attr);
   tree args = TREE_VALUE (attr);
   const struct attribute_spec *spec = lookup_attribute_spec (name);
+  tree arg;
 
   if (!spec)
     /* Unknown attribute.  */
     return false;
 
-  if (is_attribute_p ("aligned", name)
-      && args
-      && value_dependent_expression_p (TREE_VALUE (args)))
-    /* Can't apply this until we know the desired alignment.  */
-    return true;
-  else if (TREE_CODE (decl) == TYPE_DECL || spec->type_required)
+  /* If any of the arguments are dependent expressions, we can't evaluate
+     the attribute until instantiation time.  */
+  for (arg = args; arg; arg = TREE_CHAIN (arg))
+    {
+      tree t = TREE_VALUE (arg);
+      if (value_dependent_expression_p (t)
+         || type_dependent_expression_p (t))
+       return true;
+    }
+
+  if (TREE_CODE (decl) == TYPE_DECL
+      || TYPE_P (decl)
+      || spec->type_required)
     {
       tree type = TYPE_P (decl) ? decl : TREE_TYPE (decl);
 
@@ -1006,6 +1014,10 @@ is_late_template_attribute (tree attr, tree decl)
          || code == BOUND_TEMPLATE_TEMPLATE_PARM
          || code == TYPENAME_TYPE)
        return true;
+      /* Also defer attributes on dependent types.  This is not necessary
+        in all cases, but is the better default.  */
+      else if (dependent_type_p (type))
+       return true;
       else
        return false;
     }
diff --git a/gcc/testsuite/g++.dg/ext/vector11.C b/gcc/testsuite/g++.dg/ext/vector11.C
new file mode 100644 (file)
index 0000000..a321352
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/34913
+
+template<typename T> struct A
+{
+  int x[sizeof(T)] __attribute((vector_size(8)));
+};