-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc++] Fix regex_search
to match $
alone with match_default
flag
#78845
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-libcxx Author: Sanjay Marreddi (SanjayMarreddi) ChangesUsing Fixes #75042 Full diff: https://github.com/llvm/llvm-project/pull/78845.diff 2 Files Affected:
diff --git a/libcxx/include/regex b/libcxx/include/regex
index b575a267583b5f..48af5b8b57fd64 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -5124,6 +5124,14 @@ bool basic_regex<_CharT, _Traits>::__search(
}
__m.__matches_.assign(__m.size(), __m.__unmatched_);
}
+ __m.__matches_.assign(__m.size(), __m.__unmatched_);
+ if (__match_at_start(__first, __last, __m, __flags, false)) {
+ __m.__prefix_.second = __m[0].first;
+ __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
+ __m.__suffix_.first = __m[0].second;
+ __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
+ return true;
+ }
}
__m.__matches_.clear();
return false;
diff --git a/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp b/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp
index edeea517d2537a..a696d815dda5a8 100644
--- a/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp
+++ b/libcxx/test/std/re/re.const/re.matchflag/match_not_eol.pass.cpp
@@ -47,5 +47,33 @@ int main(int, char**)
assert( std::regex_search(target, re, std::regex_constants::match_not_eol));
}
+ {
+ std::string target = "foo";
+ std::regex re("$");
+ assert(std::regex_search(target, re));
+ assert(!std::regex_search(target, re, std::regex_constants::match_not_eol));
+
+ std::smatch match;
+ assert(std::regex_search(target, match, re));
+ assert(match.position(0) == 3);
+ assert(match.length(0) == 0);
+ assert(!std::regex_search(target, match, re, std::regex_constants::match_not_eol));
+ assert(match.length(0) == 0);
+ }
+
+ {
+ std::string target = "foo";
+ std::regex re("$");
+ assert(!std::regex_match(target, re));
+ assert(!std::regex_match(target, re, std::regex_constants::match_not_eol));
+ }
+
+ {
+ std::string target = "a";
+ std::regex re{"^b*$"};
+ assert(!std::regex_search(target, re));
+ assert(!std::regex_search(target, re, std::regex_constants::match_not_eol));
+ }
+
return 0;
}
|
|
|
||
{ | ||
std::string target = "a"; | ||
std::regex re{"^b*$"}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
std::regex re{"^b*$"}; | |
std::regex re("^b*$"); |
Did you test in C++03 mode?
https://libcxx.llvm.org/TestingLibcxx.html#usage
sudo libcxx/utils/libcxx-lit build/ -sv libcxx/test/std/re/re.const --param=c++03
It is interesting, this test doesn't have // UNSUPPORTED: c++03
. Regex is a C++11 feature. Maybe it is supported as an extension.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Updated the test.
- Yeah, I tested in the C++03 mode using the above command specifying the param. The tests are passing locally.
b8e8e5f
to
717b118
Compare
717b118
to
9536e7b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM -- I checked and this should fix all reported regressions around this.
Using
regex_search
with the regex_constantmatch_default
and a simple regex pattern$
is expected to match general strings such as "a", "ab", "abc"... at[last, last)
positions. But, the current implementation fails to do so.Fixes #75042