re PR c++/34913 (ICE vector in template)

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
This commit is contained in:
Jason Merrill 2008-01-24 09:41:32 -05:00 committed by Jason Merrill
parent 89bf8683d7
commit 160b8b8014
3 changed files with 30 additions and 6 deletions

View 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

View 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;
}

View File

@ -0,0 +1,6 @@
// PR c++/34913
template<typename T> struct A
{
int x[sizeof(T)] __attribute((vector_size(8)));
};