On 05/01/2022 14:47, Jonathan Wakely via Libstdc++ wrote:
Tested powerpc64le-linux, pushed to trunk.


This moves the last two template parameters of __regex_algo_impl to be
runtime function parameters instead, so that we don't need four
different instantiations for the possible ways to call it. Most of the
function (and what it instantiates) is the same in all cases, so making
them compile-time choices doesn't really have much benefit.

Use  'if constexpr' for conditions that check template parameters, so
that when we do depend on a compile-time condition we only instantiate
what we need to.

libstdc++-v3/ChangeLog:

        * include/bits/regex.h (__regex_algo_impl): Change __policy and
        __match_mode template parameters to be function parameters.
        (regex_match, regex_search): Pass policy and match mode as
        function arguments.
        * include/bits/regex.tcc (__regex_algo_impl): Change template
        parameters to function parameters.
        * include/bits/regex_compiler.h (_RegexTranslatorBase): Use
        'if constexpr' for conditions using template parameters.
        (_RegexTranslator): Likewise.
        * include/bits/regex_executor.tcc (_Executor::_M_handle_accept):
        Likewise.
        * testsuite/util/testsuite_regex.h (regex_match_debug)
        (regex_search_debug): Move template arguments to function
        arguments.
---
  libstdc++-v3/include/bits/regex.h             | 33 +++++++++----------
  libstdc++-v3/include/bits/regex.tcc           |  8 ++---
  libstdc++-v3/include/bits/regex_compiler.h    |  9 ++---
  libstdc++-v3/include/bits/regex_executor.tcc  |  2 +-
  libstdc++-v3/testsuite/util/testsuite_regex.h | 24 +++++++-------
  5 files changed, 37 insertions(+), 39 deletions(-)

Clang now fails #include <regex> with

In file included from 
gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.0/../../../../include/c++/12.0.0/regex:66:
gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.0/../../../../include/c++/12.0.0/bits/regex.h:799:9:
 error: unknown type name '_RegexExecutorPolicy'; did you mean 
'__detail::_RegexExecutorPolicy'?
                                    _RegexExecutorPolicy, bool);
                                    ^
gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.0/../../../../include/c++/12.0.0/bits/regex.h:45:14:
 note: '__detail::_RegexExecutorPolicy' declared here
  enum class _RegexExecutorPolicy : int { _S_auto, _S_alternate };
             ^
gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.0/../../../../include/c++/12.0.0/bits/regex.h:2070:9:
 error: unknown type name '_RegexExecutorPolicy'; did you mean 
'__detail::_RegexExecutorPolicy'?
                                    _RegexExecutorPolicy, bool);
                                    ^
gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/12.0.0/../../../../include/c++/12.0.0/bits/regex.h:45:14:
 note: '__detail::_RegexExecutorPolicy' declared here
  enum class _RegexExecutorPolicy : int { _S_auto, _S_alternate };
             ^

and

diff --git a/libstdc++-v3/include/bits/regex.h 
b/libstdc++-v3/include/bits/regex.h
index 7480b0a5f97..46c168010bf 100644
--- a/libstdc++-v3/include/bits/regex.h
+++ b/libstdc++-v3/include/bits/regex.h
@@ -796,7 +796,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&,
                                    const basic_regex<_Cp, _Rp>&,
                                    regex_constants::match_flag_type,
-                                   _RegexExecutorPolicy, bool);
+                                   __detail::_RegexExecutorPolicy, bool);
template<typename, typename, typename, bool>
        friend class __detail::_Executor;
@@ -2067,7 +2067,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&,
                                    const basic_regex<_Cp, _Rp>&,
                                    regex_constants::match_flag_type,
-                                   _RegexExecutorPolicy, bool);
+                                   __detail::_RegexExecutorPolicy, bool);
// Reset contents to __size unmatched sub_match objects
       // (plus additional objects for prefix, suffix and unmatched sub).

would fix that.

Reply via email to