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:
parent
89bf8683d7
commit
160b8b8014
3 changed files with 30 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
6
gcc/testsuite/g++.dg/ext/vector11.C
Normal file
6
gcc/testsuite/g++.dg/ext/vector11.C
Normal file
|
@ -0,0 +1,6 @@
|
|||
// PR c++/34913
|
||||
|
||||
template<typename T> struct A
|
||||
{
|
||||
int x[sizeof(T)] __attribute((vector_size(8)));
|
||||
};
|
Loading…
Add table
Reference in a new issue