Author: ed Date: Thu Jan 5 10:43:03 2012 New Revision: 229574 URL: http://svn.freebsd.org/changeset/base/229574
Log: Add __generic(), to be able to use a very simple _Generic(). Already introducing this allows us to be forward compatible with C11 compilers. By implementing <tgmath.h> on top of this interface, it becomes trivial to support both our existing GCC and newer compilers. Modified: head/sys/sys/cdefs.h Modified: head/sys/sys/cdefs.h ============================================================================== --- head/sys/sys/cdefs.h Thu Jan 5 10:42:19 2012 (r229573) +++ head/sys/sys/cdefs.h Thu Jan 5 10:43:03 2012 (r229574) @@ -248,6 +248,24 @@ #endif #endif +/* + * Emulation of C11 _Generic(). Unlike the previously defined C11 + * keywords, it is not possible to implement this using exactly the same + * syntax. Therefore implement something similar under the name + * __generic(). Unlike _Generic(), this macro can only distinguish + * between a single type, so it requires nested invocations to + * distinguish multiple cases. + */ + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +#define __generic(expr, t, yes, no) \ + _Generic(expr, t: yes, default: no) +#elif __GNUC_PREREQ__(3, 1) +#define __generic(expr, t, yes, no) \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(__typeof(expr), t), yes, no) +#endif + #if __GNUC_PREREQ__(2, 96) #define __malloc_like __attribute__((__malloc__)) #define __pure __attribute__((__pure__)) _______________________________________________ [email protected] mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "[email protected]"
