PR c++/34962, c++/34937, c++/34939
authorJason Merrill <jason@redhat.com>
Wed, 13 Feb 2008 21:27:16 +0000 (16:27 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 13 Feb 2008 21:27:16 +0000 (16:27 -0500)
        PR c++/34962, c++/34937, c++/34939
        * decl2.c (is_late_template_attribute): Always defer attributes
        vector_size and weak.

From-SVN: r132297

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

index 65bf6234f9e4d77b781f577dfc16ca4ca9abd17d..38f951032e6b6dfb3ede8aefe8d84b61399ef2b1 100644 (file)
@@ -1,5 +1,9 @@
 2008-02-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/34962, c++/34937, c++/34939
+       * decl2.c (is_late_template_attribute): Always defer attributes 
+       vector_size and weak.
+
        PR c++/34774
        * pt.c (value_dependent_expression_p): Look into DECL_INITIAL
        of enumerators, too.
index 1832926eb3176089687c997a0cfc6b026c8761b2..695390ce78fb07ba9a8d272e7a64576da14a037c 100644 (file)
@@ -991,6 +991,13 @@ is_late_template_attribute (tree attr, tree decl)
     /* Unknown attribute.  */
     return false;
 
+  /* Attribute vector_size handling wants to dive into the back end array
+     building code, which breaks during template processing.  */
+  if (is_attribute_p ("vector_size", name)
+      /* Attribute weak handling wants to write out assembly right away.  */
+      || is_attribute_p ("weak", name))
+    return true;
+
   /* 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))
diff --git a/gcc/testsuite/g++.dg/ext/tmplattr9.C b/gcc/testsuite/g++.dg/ext/tmplattr9.C
new file mode 100644 (file)
index 0000000..721ccef
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/34937, 34962
+// { dg-options "" }
+
+struct A
+{
+  static const int i;
+};
+
+template<int> void foo()
+{
+  int x[A::i] __attribute((vector_size(8)));
+}
+
+template<int> struct B
+{
+  enum { a, b = a };
+  void bar(B<b>) __attribute((weak));
+};
+
+void f()
+{
+  foo<0>();
+  B<0> b;
+  b.bar (B<B<0>::b>());
+}