diff --git a/doc/tutorial.qbk b/doc/tutorial.qbk index 3701640f..63cfb550 100644 --- a/doc/tutorial.qbk +++ b/doc/tutorial.qbk @@ -3216,9 +3216,6 @@ overloads. [important _trans_replace_ and _trans_replace_v_ are not available on MSVC in C++17 mode.] -[important _trans_replace_ and _trans_replace_v_ are not available on GCC in -C++20 mode before GCC 12.] - _trans_replace_ creates _trans_replace_vs_. _trans_replace_v_ is a `std::views`-style view. It produces a range of subranges from the parsed range `r` and the given invocable `f`. Wherever in the parsed range a match diff --git a/include/boost/parser/detail/text/detail/all_t.hpp b/include/boost/parser/detail/text/detail/all_t.hpp index 1d77691f..6ed16692 100644 --- a/include/boost/parser/detail/text/detail/all_t.hpp +++ b/include/boost/parser/detail/text/detail/all_t.hpp @@ -131,7 +131,8 @@ namespace boost::parser::detail::text::detail { constexpr all_impl all; -#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS +#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS && \ + (!defined(__GNUC__) || 12 <= __GNUC__) template using all_t = std::views::all_t; #else diff --git a/include/boost/parser/detail/text/transcode_view.hpp b/include/boost/parser/detail/text/transcode_view.hpp index 92f439a8..33b43076 100644 --- a/include/boost/parser/detail/text/transcode_view.hpp +++ b/include/boost/parser/detail/text/transcode_view.hpp @@ -44,13 +44,27 @@ namespace boost::parser::detail { namespace text { using iterator_to_tag_t = decltype(iterator_to_tag()); #if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS +#if defined(__GNUC__) && __GNUC__ < 12 + // This uses the final version of viewable_range. Older GCCs use a + // different one that breaks, so we use this on instead of the one + // from std::ranges::. It's missing the !initializer_list part. + template + concept viewable_range = std::ranges::range && + ((std::ranges::view> && + std::constructible_from, T>) || + (!std::ranges::view> && + (std::is_lvalue_reference_v || + std::movable>))); +#else + template + concept viewable_range = std::ranges::viewable_range; +#endif + template using with_reference = T &; template concept can_reference = requires { typename with_reference; }; -#endif -#if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS template struct cast_to_charn { constexpr Char operator()(Char c) const { return c; } @@ -265,7 +279,7 @@ namespace boost::parser::detail { namespace text { #if BOOST_PARSER_DETAIL_TEXT_USE_ALIAS_CTAD template - project_view(R &&) -> project_view, F>; + project_view(R &&) -> project_view, F>; #endif namespace detail { @@ -281,7 +295,7 @@ namespace boost::parser::detail { namespace text { #if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS template - requires std::ranges::viewable_range && + requires viewable_range && std::ranges::input_range && std::regular_invocable> && detail::can_reference>> @@ -402,7 +416,7 @@ namespace boost::parser::detail { namespace text { { #if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS template - requires (std::ranges::viewable_range && + requires (viewable_range && std::ranges::input_range && std::convertible_to, format_to_type_t>) || utf_pointer> @@ -606,7 +620,7 @@ namespace boost::parser::detail { namespace text { #if BOOST_PARSER_DETAIL_TEXT_USE_ALIAS_CTAD template - utf_view(R &&) -> utf_view>; + utf_view(R &&) -> utf_view>; template using utf8_view = utf_view; @@ -757,7 +771,7 @@ namespace boost::parser::detail { namespace text { #if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS template requires is_utf_view> || - (std::ranges::viewable_range && + (viewable_range && can_utf_view, View>) || utf_pointer> #else diff --git a/include/boost/parser/transform_replace.hpp b/include/boost/parser/transform_replace.hpp index 1dbde334..6b7f3b32 100644 --- a/include/boost/parser/transform_replace.hpp +++ b/include/boost/parser/transform_replace.hpp @@ -3,8 +3,7 @@ #include -#if (!defined(_MSC_VER) || BOOST_PARSER_USE_CONCEPTS) && \ - (!defined(__GNUC__) || 12 <= __GNUC__ || !BOOST_PARSER_USE_CONCEPTS) +#if (!defined(_MSC_VER) || BOOST_PARSER_USE_CONCEPTS) namespace boost::parser { diff --git a/test/transform_replace.cpp b/test/transform_replace.cpp index a05b9a21..5d439e94 100644 --- a/test/transform_replace.cpp +++ b/test/transform_replace.cpp @@ -14,8 +14,7 @@ #include -#if (!defined(_MSC_VER) || BOOST_PARSER_USE_CONCEPTS) && \ - (!defined(__GNUC__) || 12 <= __GNUC__ || !BOOST_PARSER_USE_CONCEPTS) +#if (!defined(_MSC_VER) || BOOST_PARSER_USE_CONCEPTS) namespace bp = boost::parser;