aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2008-02-13 16:27:16 -0500
committerJason Merrill <jason@gcc.gnu.org>2008-02-13 16:27:16 -0500
commit8d2eb30433ecedf4db7e00b62320973a587f4216 (patch)
treef0a53631f0a7643da1914e48d93b1ae0fd356267 /gcc
parent1b0c753a864e5d059a7cdd792b982b45cf4c9549 (diff)
downloadgcc-8d2eb30433ecedf4db7e00b62320973a587f4216.zip
gcc-8d2eb30433ecedf4db7e00b62320973a587f4216.tar.gz
gcc-8d2eb30433ecedf4db7e00b62320973a587f4216.tar.bz2
PR c++/34962, c++/34937, c++/34939
PR c++/34962, c++/34937, c++/34939 * decl2.c (is_late_template_attribute): Always defer attributes vector_size and weak. From-SVN: r132297
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl2.c7
-rw-r--r--gcc/testsuite/g++.dg/ext/tmplattr9.C25
3 files changed, 36 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 65bf623..38f9510 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 1832926..695390c 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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
index 0000000..721ccef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/tmplattr9.C
@@ -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>());
+}