| diff --git a/source/i18n/double-conversion-utils.h b/source/i18n/double-conversion-utils.h |
| index 10d8fdd1..8c6a0e16 100644 |
| --- a/source/i18n/double-conversion-utils.h |
| +++ b/source/i18n/double-conversion-utils.h |
| @@ -66,15 +66,23 @@ inline void abort_noreturn() { abort(); } |
| #endif |
| #endif |
| |
| +// Not all compilers support __has_attribute and combining a check for both |
| +// ifdef and __has_attribute on the same preprocessor line isn't portable. |
| +#ifdef __has_attribute |
| +# define DOUBLE_CONVERSION_HAS_ATTRIBUTE(x) __has_attribute(x) |
| +#else |
| +# define DOUBLE_CONVERSION_HAS_ATTRIBUTE(x) 0 |
| +#endif |
| + |
| #ifndef DOUBLE_CONVERSION_UNUSED |
| -#ifdef __GNUC__ |
| +#if DOUBLE_CONVERSION_HAS_ATTRIBUTE(unused) |
| #define DOUBLE_CONVERSION_UNUSED __attribute__((unused)) |
| #else |
| #define DOUBLE_CONVERSION_UNUSED |
| #endif |
| #endif |
| |
| -#if defined(__clang__) && __has_attribute(uninitialized) |
| +#if DOUBLE_CONVERSION_HAS_ATTRIBUTE(uninitialized) |
| #define DOUBLE_CONVERSION_STACK_UNINITIALIZED __attribute__((uninitialized)) |
| #else |
| #define DOUBLE_CONVERSION_STACK_UNINITIALIZED |