[PATCH] New syntax and functionality for __has_attribute

Aaron Ballman aaron at aaronballman.com
Fri Jan 10 14:07:34 PST 2014


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.

~Aaron
-------------- next part --------------
A non-text attachment was scrubbed...
Name: HasAttribute.patch
Type: application/octet-stream
Size: 18694 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140110/f29791cb/attachment.obj>


More information about the cfe-commits mailing list