libstdc++: Implement std::regex_constants::multiline (LWG 2503)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 Sep 2021 12:48:19 +0000 (13:48 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 29 Sep 2021 12:48:19 +0000 (13:48 +0100)
commitf38cd3bdb4cd429a5f7082ea91793a59b37d47b9
treebe23a5f66d83fea6c12a180553055b8ca2217526
parent9ca4c42a3b756e54a92ff8e1ac6c396b680b7839
libstdc++: Implement std::regex_constants::multiline (LWG 2503)

This implements LWG 2503, which allows ^ and $ to match line terminator
characters, rather than only matching the beginning and end of the
entire input. The multiline option is only valid for ECMAScript, but
for other grammars we ignore it rather than throwing an exception.

This is related to PR libstdc++/102480, which incorrectly said that
ECMAscript should match the beginning of a line when match_prev_avail
is used. I think that's only supposed to happen when multiline is used.

The new regex_constants::multiline and basic_regex::multiline constants
are not defined for strict -std=c++11 and -std=c++14 modes, but
regex_constants::__multiline is always defined, so that the
implementation can use it internally.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* include/bits/regex.h (basic_regex::multiline): Define constant
for C++17.
* include/bits/regex_constants.h (regex_constants::multiline):
Define constant for C++17.
(regex_constants::__multiline): Define duplicate constant for
internal use in C++11 and C++14.
* include/bits/regex_executor.h (_Executor::_M_match_multiline()):
New member function.
(_Executor::_M_is_line_terminator(_CharT)): New member function.
(_Executor::_M_at_begin(), _Executor::_M_at_end()): Use new
member functions to support multiline matches.
* testsuite/28_regex/algorithms/regex_match/multiline.cc: New test.
libstdc++-v3/include/bits/regex.h
libstdc++-v3/include/bits/regex_constants.h
libstdc++-v3/include/bits/regex_executor.h
libstdc++-v3/testsuite/28_regex/algorithms/regex_match/multiline.cc [new file with mode: 0644]