diff --git a/doc/macro_reference.qbk b/doc/macro_reference.qbk index d8975729..e37efac1 100644 --- a/doc/macro_reference.qbk +++ b/doc/macro_reference.qbk @@ -978,6 +978,7 @@ provide compliant C++17 support. [table [[Macro ][ Description ]] [[`BOOST_INLINE_VARIABLE`][This macro expands to `inline` on compilers that support C++17 inline variables and to nothing otherwise. Users may need to check for `BOOST_NO_CXX17_INLINE_VARIABLES` for further adjustments to the code.]] +[[`BOOST_IF_CONSTEXPR`][Expands to `if constexpr` when supported, or `if` otherwise.]] [[`BOOST_INLINE_CONSTEXPR`][This is a shortcut for `BOOST_INLINE_VARIABLE BOOST_CONSTEXPR_OR_CONST`.]] ] diff --git a/include/boost/config/detail/suffix.hpp b/include/boost/config/detail/suffix.hpp index 48069064..d3c4e083 100644 --- a/include/boost/config/detail/suffix.hpp +++ b/include/boost/config/detail/suffix.hpp @@ -1002,6 +1002,14 @@ namespace std{ using ::type_info; } #else #define BOOST_INLINE_VARIABLE #endif +// +// C++17 if constexpr +// +#if !defined(BOOST_NO_CXX17_IF_CONSTEXPR) +# define BOOST_IF_CONSTEXPR if constexpr +#else +# define BOOST_IF_CONSTEXPR if +#endif #define BOOST_INLINE_CONSTEXPR BOOST_INLINE_VARIABLE BOOST_CONSTEXPR_OR_CONST diff --git a/test/helper_macro_test.cpp b/test/helper_macro_test.cpp index efdb20f9..18b9268a 100644 --- a/test/helper_macro_test.cpp +++ b/test/helper_macro_test.cpp @@ -51,6 +51,12 @@ struct no_unique BOOST_ATTRIBUTE_NO_UNIQUE_ADDRESS empty b; }; +template +struct trait +{ + enum { value = b }; +}; + int main() { @@ -66,6 +72,11 @@ int main() always_throw(); nodiscard_struct s; no_unique no_un; + + BOOST_IF_CONSTEXPR(trait::value) + { + result += 2; + } } catch(int) {