On Sat, Jan 11, 2014 at 2:31 PM, Alp Toker <[email protected]> wrote: > > 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.
There's currently a test in the test suite which I think covers this case: // CHECK: has_has_attribute #ifdef __has_attribute int has_has_attribute(); #endif Is that what you are referring to? If so, then yes, this patch does still meet that need. Thanks! ~Aaron _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
