[libcxx-commits] [libcxx] [libc++][regex] Correctly adjust match prefix for zero-length matches. (PR #94550)
Konstantin Varlamov via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jun 5 17:42:48 PDT 2024
================
@@ -114,5 +114,53 @@ int main(int, char**)
assert(i == e);
}
+ {
+ // Check that we correctly adjust the match prefix when dealing with zero-length matches -- this is explicitly
+ // required by the Standard ([re.regiter.incr]: "In all cases in which the call to `regex_search` returns true,
+ // `match.prefix().first` shall be equal to the previous value of `match[0].second`"). For a pattern that matches
+ // empty sequences, there is an implicit zero-length match between every character in a string -- make sure the
+ // prefix of each of these matches (except the first one) is the preceding character.
+
+ auto validate = [](const std::regex& empty_matching_pattern) {
+ const char source[] = "abc";
+
+ std::cregex_iterator i(source, source + 3, empty_matching_pattern);
+ assert(!i->prefix().matched);
+ assert(i->prefix().length() == 0);
+ assert(i->prefix().first == source);
+ assert(i->prefix().second == source);
+
+ ++i;
+ assert(i->prefix().matched);
----------------
var-const wrote:
Not sure if this repetition warrants another helper function (calls would look something like
```cpp
check_prefix(i->prefix(), /*matched=*/true, /*length=*/1, /*first=*/source, /*second=*/source + 1);
```
).
https://github.com/llvm/llvm-project/pull/94550
More information about the libcxx-commits
mailing list