re PR c++/36662 (vector vs template)
authorJakub Jelinek <jakub@redhat.com>
Mon, 30 Jun 2008 20:41:29 +0000 (22:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 30 Jun 2008 20:41:29 +0000 (22:41 +0200)
PR c++/36662
* decl2.c (is_late_template_attribute): If the first attribute
argument is IDENTIFIER_NODE, don't consider it when checking
if arguments are value or type dependent.

* g++.dg/ext/altivec-16.C: New test.

From-SVN: r137287

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

index 7c7fd12fe71b358d403fe0b7b15b89b7e6df0d77..cfa462685138c012fbccf7b2a4ea1ac64a89bb98 100644 (file)
@@ -1,3 +1,10 @@
+2008-06-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/36662
+       * decl2.c (is_late_template_attribute): If the first attribute
+       argument is IDENTIFIER_NODE, don't consider it when checking
+       if arguments are value or type dependent.
+
 2008-06-30  Kenneth Zadeck <zadeck@naturalbridge.com>
 
        * ifcvt.c (cond_move_process_if_block): Free vectors on false
index ee229f4e87858bffac6794a9fa564b0177d6fdff..a5ece9a670911868612b4bbbc3bb3cafbbea89a6 100644 (file)
@@ -1,6 +1,7 @@
 /* Process declarations and variables for C++ compiler.
    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008  Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
+   Free Software Foundation, Inc.
    Hacked by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GCC.
@@ -1005,6 +1006,14 @@ is_late_template_attribute (tree attr, tree decl)
   for (arg = args; arg; arg = TREE_CHAIN (arg))
     {
       tree t = TREE_VALUE (arg);
+
+      /* If the first attribute argument is an identifier, only consider
+        second and following arguments.  Attributes like mode, format,
+        cleanup and several target specific attributes aren't late
+        just because they have an IDENTIFIER_NODE as first argument.  */
+      if (arg == args && TREE_CODE (t) == IDENTIFIER_NODE)
+       continue;
+
       if (value_dependent_expression_p (t)
          || type_dependent_expression_p (t))
        return true;
index a23526877dddbafa081dc95891c2b52e63d19035..f1ca63236b2d875fa53067c96292c4ff390bdff1 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-30  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/36662
+       * g++.dg/ext/altivec-16.C: New test.
+
 2008-06-30  Ira Rosen  <irar@il.ibm.com>
 
        PR tree-optimization/36648
diff --git a/gcc/testsuite/g++.dg/ext/altivec-16.C b/gcc/testsuite/g++.dg/ext/altivec-16.C
new file mode 100644 (file)
index 0000000..91230d2
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/36662
+// { dg-do compile { target powerpc*-*-* } }
+// { dg-require-effective-target powerpc_altivec_ok }
+// { dg-options "-maltivec" }
+
+#define vector __attribute__((altivec (vector__)))
+
+template <typename c> struct S {};
+
+template <> struct S<vector float>
+{
+  static vector float zero;
+};
+
+template <int>
+void g (void)
+{
+  vector float t = S<vector float>::zero;
+}