__has_attribute and pragmas

Aaron Ballman aaron at aaronballman.com
Mon Nov 24 07:02:51 PST 2014


On Thu, Nov 20, 2014 at 7:22 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Thu, Nov 20, 2014 at 3:48 PM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> On Thu, Nov 20, 2014 at 6:27 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>> > On Thu, Nov 20, 2014 at 1:38 PM, Aaron Ballman <aaron at aaronballman.com>
>> > wrote:
>> >>
>> >> The __has_attribute implementation does not pay attention to the
>> >> syntax supported by attributes -- instead, it looks to see whether an
>> >> attribute is generally known with that spelling. Since pragmas can now
>> >> be spelled as attributes, this means __has_attribute(loop) returns
>> >> true because of the #pragma loop functionality. Same for unroll.
>> >>
>> >> Should __has_attribute ignore attributes spelled with a #pragma
>> >> spelling?
>> >
>> >
>> > I would go further: __has_attribute should probably only look for
>> > GNU-syntax
>> > attributes. We have __has_cpp_attribute for C++-syntax attributes now,
>> > and I
>> > don't think anyone is (yet) using this for __declspec, so now seems like
>> > a
>> > good time to make this change.
>>
>> A long, long while back, we discussed having a way to determine
>> attributes by syntax, because that's sometimes important, as well as a
>> general query mechanism.
>>
>> How about adding:
>>
>> __has_declspec_attribute
>> __has_keyword_attribute
>> __has_gnu_attribute
>>
>> and leaving __has_attribute generic across syntaxes?
>>
>> This also reduces the chances of breaking code by allowing the
>> __has_attribute syntax to continue to work as it always has.
>
>
> Back when we only had GNU attributes, that's all it detected. I'm not
> convinced that people are actually using it for anything else,

I believe I've seen some code using it for __declspec attributes.
IIRC, we may have run into this with MinGW, which implements
__declspec as a macro, replaced by __attribute__.

> and I think
> it would be surprising if it said an attribute was supported but that
> attribute didn't work with GNU syntax. A generic-across-syntaxes
> __has_attribute is basically useless.

The more I think about cross-syntax attribute checking, the more I
agree it's useless.

I still think it would make sense to add the various forms of this,
and I definitely think that pragmas should be excluded from
__has_attribute.

How does this sound as a path forward:

* Change __has_attribute to only support GNU-style attributes. This
has the potential to break code, so this will require careful watching
of the lists.
* Add __has_declspec_attribute & __has_keyword_attribute, that only
apply to __declspecs and keywords.

~Aaron



More information about the cfe-commits mailing list