On Wed, Oct 12, 2016 at 3:55 AM, Jonathan Wakely <cxx@kayari.org> wrote:
The SD-6 draft has

[3.3.6] Example

This demonstrates a way to use the attribute [[deprecated]] only if it
is available.

#ifdef __has_cpp_attribute
#  if __has_cpp_attribute(deprecated)
#    define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
#  else
#    define ATTR_DEPRECATED(msg)
#  endif
#endif



This leaves ATTR_DEPRECATED undefined if the compiler doesn't support
the __has_cpp_attribute macro, is that intended? Unless the idea is
that some other method would be used to decide if it's available, it
should be something like:

#ifdef __has_cpp_attribute
#  if __has_cpp_attribute(deprecated)
#    define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
#  endif
#endif
#ifndef ATTR_DEPRECATED(msg)
#  define ATTR_DEPRECATED(msg)
#endif

The usage model we've always documented for these __has_* macros in Clang is:

#ifndef __has_cpp_attribute
# define __has_cpp_attribute(x) 0
#endif

#if __has_cpp_attribute(deprecated)
#  define ATTR_DEPRECATED(msg) [[deprecated(msg)]]
#else
#  define ATTR_DEPRECATED(msg)
#endif

Would it also be useful to mention that the grammar term
"attribute-token" allows scoped attributes, such as foo::bar, so that
non-standard attributes can be tested the same way?
_______________________________________________
Features mailing list
Features@isocpp.open-std.org
http://www.open-std.org/mailman/listinfo/features