https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64781
Bug ID: 64781
Summary: regex out-of-range submatches should represent an
unmatched sub-expression
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: kaballo86 at hotmail dot com
The following snippet fails with a runtime assertion:
#include <regex>
#include <cassert>
int main() {
std::match_results<const char*> m;
const char s[] = "a";
assert(std::regex_search(s, m, std::regex("a")));
assert(m.size() == 1);
assert(m[0].first == s+0);
assert(m[0].second == s+1);
assert(m[0].matched == true);
assert(m[42].first == s+1); // fires
assert(m[42].second == s+1); // fires
assert(m[42].matched == false);
}
28.10.4 [re.results.acc]/8 says "If `n >= size()` then returns a `sub_match`
object representing an unmatched sub-expression."
While the term "unmatched sub-expression" does not appear anywhere else in the
standard, this is presumably 28.10 [re.results]/4 "If the sub-expression `n`
participated in a regular expression match then the `sub_match` member
`matched` evaluates to `true`, and members `first` and `second` denote the
range of characters `[first,second)` which formed that match. Otherwise
`matched` is `false`, and members `first` and `second` point to the end of the
sequence that was searched."
According to that, `m[n].first == m[n].last == s+1` should hold for `n >= 1`.