From 46a92fd8a436d59e85d8a7fad508c3ca6c60e204 Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Sun, 2 Feb 2020 11:53:21 -0500 Subject: [PATCH] Guard __has_builtin --- include/boost/static_string/config.hpp | 16 +++++++++++++--- include/boost/static_string/static_string.hpp | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/boost/static_string/config.hpp b/include/boost/static_string/config.hpp index 3d12242..7d681ba 100644 --- a/include/boost/static_string/config.hpp +++ b/include/boost/static_string/config.hpp @@ -32,11 +32,18 @@ #endif #endif +// Can we use __has_builtin? +#ifdef __has_builtin +#define BOOST_STATIC_STRING_HAS_BUILTIN(arg) __has_builtin(arg) +#else +#define BOOST_STATIC_STRING_HAS_BUILTIN(arg) 0 +#endif + // Can we use is_constant_evaluated? // Standard version #if __cpp_lib_is_constant_evaluated >= 201811L #define BOOST_STATIC_STRING_IS_CONST_EVAL std::is_constant_evaluated() -#elif defined(__clang__) && __has_builtin(__builtin_is_constant_evaluated) +#elif defined(__clang__) && BOOST_STATIC_STRING_HAS_BUILTIN(__builtin_is_constant_evaluated) // If we have clang version 9+, we can use the intrinsic // While gcc also has this, we don't need it #define BOOST_STATIC_STRING_IS_CONST_EVAL __builtin_is_constant_evaluated() @@ -53,6 +60,7 @@ #define BOOST_STATIC_STRING_NODISCARD #endif + // MSVC doesn't define __cplusplus by default #ifdef _MSVC_LANG #define BOOST_STATIC_STRING_STANDARD_VERSION _MSVC_LANG @@ -160,11 +168,13 @@ defined(__clang__) && \ // that cannot use the library comparison function // objects at all in constant expresssions. In these // cases, we use whatever will make more constexpr work. -#if defined(__clang__) && defined(__GLIBCXX__) && ((__GLIBCXX__ > 20181206 && __GLIBCXX__ <= 20190812)) +#if defined(__clang__) +#if defined(__GLIBCXX__) && ((__GLIBCXX__ > 20181206 && __GLIBCXX__ <= 20190812)) #define BOOST_STATIC_STRING_NO_PTR_COMP_FUNCTIONS -#elif __has_builtin(__builtin_constant_p) || defined(BOOST_STATIC_STRING_IS_CONST_EVAL) +#elif BOOST_STATIC_STRING_HAS_BUILTIN(__builtin_constant_p) || defined(BOOST_STATIC_STRING_IS_CONST_EVAL) #define BOOST_STATIC_STRING_NO_PTR_COMP_FUNCTIONS #endif +#endif namespace boost { namespace static_string { diff --git a/include/boost/static_string/static_string.hpp b/include/boost/static_string/static_string.hpp index ad152a6..6711049 100644 --- a/include/boost/static_string/static_string.hpp +++ b/include/boost/static_string/static_string.hpp @@ -627,7 +627,7 @@ is_inside( return true; return false; } -#elif defined(__clang__) && __has_builtin(__builtin_constant_p) +#elif defined(__clang__) && BOOST_STATIC_STRING_HAS_BUILTIN(__builtin_constant_p) // We can also try using __builtin_constant_p if (__builtin_constant_p((ptr, src_first, src_last))) {