From ff3d3f01025b881c7cadf093b0f65309c35f2c53 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 5 Jul 2017 21:25:31 +0100 Subject: [PATCH] utils/macros.h: Add support for Clang-specific hacks. These are mostly the same as GCC, but (fortunately!) Clang's diagnostics handling is less broken than GCC's, so we can do the same job much more simply. --- utils/macros.h | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/utils/macros.h b/utils/macros.h index 35ececf..02d820e 100644 --- a/utils/macros.h +++ b/utils/macros.h @@ -53,24 +53,49 @@ # define GCC_VERSION_P(maj, min) 0 #endif -#if GCC_VERSION_P(2, 5) +#ifdef __clang__ +# define CLANG_VERSION_P(maj, min) \ + (__clang_major__ > (maj) || (__clang_major__ == (maj) && \ + __clang_minor__ >= (min))) +#else +# define CLANG_VERSION_P(maj, min) 0 +#endif + +#if GCC_VERSION_P(2, 5) || CLANG_VERSION_P(3, 3) # define NORETURN __attribute__((noreturn)) # define PRINTF_LIKE(fix, aix) __attribute__((format(printf, fix, aix))) # define SCANF_LIKE(fix, aix) __attribute__((format(scanf, fix, aix))) # define IGNORABLE __attribute__((unused)) #endif -#if GCC_VERSION_P(4, 5) +#if GCC_VERSION_P(4, 5) || CLANG_VERSION_P(3, 3) # define DEPRECATED(msg) __attribute__((deprecated(msg))) #elif GCC_VERSION_P(3, 1) # define DEPRECATED(msg) __attribute__((deprecated)) #endif -#if GCC_VERSION_P(4, 0) +#if GCC_VERSION_P(4, 0) || CLANG_VERSION_P(3, 3) # define EXECL_LIKE(ntrail) __attribute__((sentinel(ntrail))) #endif -#if GCC_VERSION_P(4, 6) +#if CLANG_VERSION_P(3, 3) + +# define MLIB__PRAGMA_HACK(x) _Pragma(#x) +# define MLIB__MUFFLE_WARNINGS(warns, body) \ + _Pragma("clang diagnostic push") \ + warns \ + body \ + _Pragma("clang diagnostic pop") +# define CLANG_WARNING(warn) \ + MLIB__PRAGMA_HACK(clang diagnostic ignored warn) +# define MUFFLE_WARNINGS_DECL(warns, body) \ + MLIB__MUFFLE_WARNINGS(warns, body) +# define MUFFLE_WARNINGS_EXPR(warns, body) \ + __extension__ ({ MLIB__MUFFLE_WARNINGS(warns, (body);) }) +# define MUFFLE_WARNINGS_STMT(warns, body) \ + do { MLIB__MUFFLE_WARNINGS(warns, body) } while (0) + +#elif GCC_VERSION_P(4, 6) /* --- Diagnostic suppression in GCC: a tale of woe --- * * @@ -172,6 +197,10 @@ # define GCC_WARNING(warn) #endif +#ifndef CLANG_WARNING +# define CLANG_WARNING(warn) +#endif + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus -- 2.11.0