[cfe-dev] [PATCH] New syntax and functionality for __has_attribute

Alp Toker alp at nuanti.com
Sat Jan 11 11:31:48 PST 2014

On 10/01/2014 22:07, Aaron Ballman wrote:
> The __has_attribute feature macro is fantastic in many respects, but
> is lacking the ability to determine whether a specific attribute
> syntax is available or not. Instead, it currently checks whether the
> attribute is known within the compilation target, and nothing more.
> This can cause problems because not all attributes are applied in the
> same way.
> Consider dllexport as a contrived example:
> #if __has_attribute(dllexport)
>    void foo(void) __attribute__((dllexport));
> #endif
> This code looks fine, but is actually broken because clang only
> supports __declspec(dllexport) and not __attribute__((dllexport)), and
> __declspec must precede the declaration.
> The attached patch implements new syntax for __has_attribute while
> retaining backwards compatibility. It allows you to specify exactly
> which attribute syntax you desire. If no specific syntax is specified,
> it behaves as it always has.
> The supported forms are:
> __has_attribute(__attribute__((ident))) // GNU-style
> __has_attribute(__declspec(ident)) // MS-style
> __has_attribute([[ident]])  // C++11-style
> __has_attribute([[scope::ident]]) // C++11-style
> __has_attribute(ident) // Keywords, or "don't care"
> Note that attribute arguments are not supported by design -- they
> really don't make any sense in the context of a feature macro.

Hi Aaron,

This is a step forward with some long-standing problems so certainly 
would be a step forward. The syntax is unconventional but not unreasonable.

Have you confirmed that the new __has_attribute() syntax can still be 
defined to an empty expansion? That pattern is important to provide 
source compatibility with gcc / MSVC. The latter in particular has 
fairly different expansion rules to watch out for -- I've got a feeling 
it'll be OK as long as no commas appear in the argument list (which was 
a problem with the other proposed "cxx, ..." syntax) but it's worth 
double checking.


> ~Aaron
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

the browser experts

More information about the cfe-dev mailing list