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.