On Thu, Dec 13, 2018 at 02:05:29PM -0700, Martin Sebor wrote: > > So how is the builtin defined then? Is the argument always an expression > > and you only return whether its type has the attribute, or do something > > different if the expression is of certain kind? > > For a DECL the built-in looks at both the DECL_ATTRIBUTES and > the DECL's type's TYPE_ATTRIBUTES. For expressions, it just > looks at TYPE_ATTRIBUTES of the expression's type. I'm not > sure that this is necessarily the cleanest design but it's > meant to follow how attributes are applied to DECLs. Sometimes > they get applied to the DECL itself and other times to its type. > This has been causing confusion to both users and GCC devs such > as myself so at some point I'd like to make this clearer somehow. > Not sure exactly how yet.
But some users of the attribute look for the attribute on TYPE_ATTRIBUTES, other on DECL_ATTRIBUTES, and the attributes have bools which say to what they apply. So, I think the API need to be very clear whether the attribute is on a decl or on a type. If it is similar to say sizeof/__alignof__ etc., where it accepts either a type (for which one can use __typeof/decltype etc.), in which case it would check the type attributes, or an expression and in that case require it to be a decl and use decl attributes, one API is fine, but supporting arbitrary expressions and sometimes looking at type, other times at decl or both is not a good design. Jakub