[C PATCH] Make attributes accept enum values (PR c/50459)
Marek Polacek
polacek@redhat.com
Tue Apr 15 20:10:00 GMT 2014
On Tue, Apr 15, 2014 at 09:59:10AM -0400, Jason Merrill wrote:
> On 04/14/2014 11:10 AM, Marek Polacek wrote:
> >+ else if (TREE_CODE (val) == IDENTIFIER_NODE)
> >+ {
> >+ tree t = lookup_name (val);
> >+ if (t && TREE_CODE (t) == CONST_DECL)
> >+ return DECL_INITIAL (t);
> >+ }
>
> I'm uncomfortable with this; we should have looked up any attributes
> in the parser. Does the testsuite hit this code?
Thanks for looking at it.
So the newer version of the patch contains:
+ else if (TREE_CODE (val) == IDENTIFIER_NODE)
+ {
+ tree t = lookup_name (val);
+ if (t && TREE_CODE (t) == CONST_DECL)
+ val = default_conversion (t);
+ }
The testsuite doesn't hit this code with C++, but does hit this code
with C. The thing is, if we have e.g.
enum { A = 128 };
void *fn1 (void) __attribute__((assume_aligned (A)));
then handle_assume_aligned_attribute walks the attribute arguments
and gets the argument via TREE_VALUE. If this argument is an enum
value, then for C the argument is identifier_node that contains const_decl,
but for C++ the argument is directly const_decl. That means for C++ in
get_attrib_value we just call default_conversion as before, but for C we
call lookup_name firstly.
Does this answer your question?
Marek
More information about the Gcc-patches
mailing list