From a5cd8c15a9a44858d91bbadbaed30173e79f9a5a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 22 Nov 2018 13:19:08 +0200 Subject: Switch to std::optional in more configurations --- libbutl/optional.mxx | 50 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/libbutl/optional.mxx b/libbutl/optional.mxx index 87ba361..33ee3d3 100644 --- a/libbutl/optional.mxx +++ b/libbutl/optional.mxx @@ -8,18 +8,46 @@ // C includes. -// Note: Clang must come first (also defines __GNUC__). +// Note: the Clang check must come before GCC since also defines __GNUC__. // -// @@ Clang might be using libstdc++ without optional (feature test macro?) -// @@ Move to /ft/? -// -// Note: make sure we use butl::optional during ODB compilation (has to be -// this way until we completely switch to std::optional). -// -#if !defined(ODB_COMPILER) && \ - __cplusplus >= 201703L && \ - defined(__GNUC__) && __GNUC__ >= 7 && !defined(__clang__) -# define LIBBUTL_STD_OPTIONAL +#if defined(ODB_COMPILER) + // + // Make sure we use butl::optional during ODB compilation (has to be this + // way until we completely switch to std::optional since we use the same + // generated code for all compiler). + // +#elif defined(_MSC_VER) + // + // Available from 19.10 (15.0). Except it (or the compiler) doesn't seem to + // be constexpr-correct. Let's re-test with 16.0. + // +# if _MSC_VER > 1916 +# define LIBBUTL_STD_OPTIONAL +# endif +#elif defined(__clang__) + // + // Clang's libc++ has it since 4 but we might also be using libstdc++. For + // the latter we will check for the presence of the header which + // only appeared in GCC 7. Also assume both are only available in C++17. + // +# if __cplusplus >= 201703L +# if __has_include(<__config>) +# include <__config> // _LIBCPP_VERSION +# if _LIBCPP_VERSION >= 4000 +# define LIBBUTL_STD_OPTIONAL +# endif +# elif __has_include() +# define LIBBUTL_STD_OPTIONAL +# endif +# endif +#elif defined(__GNUC__) + // + // Available from 7 but only in the C++17 mode. Note also that from 8 + // defines __cpp_lib_optional. + // +# if __GNUC__ >= 7 && __cplusplus >= 201703L +# define LIBBUTL_STD_OPTIONAL +# endif #endif #ifndef __cpp_lib_modules -- cgit v1.1