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
This commit is contained in:
Jason Merrill 2008-02-13 16:27:16 -05:00 committed by Jason Merrill
parent 1b0c753a86
commit 8d2eb30433
3 changed files with 36 additions and 0 deletions

View 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.

View 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))

View File

@ -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>());
}