On Thu, 6 Jan 2022 at 10:43, Jonathan Wakely wrote: > > > On Thu, 6 Jan 2022 at 10:33, Jonathan Wakely wrote: > >> >> >> On Thu, 6 Jan 2022 at 10:00, Stephan Bergmann >> wrote: >> >>> 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 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 >>> > 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. >>> >> >> >> I'll make the change, but this looks like a clang bug: >> https://godbolt.org/z/bozxYErrc >> > > Maybe this one: https://github.com/llvm/llvm-project/issues/38230 > I've pushed the fix now, thanks for the report.