[PATCH] D25595: [libcxx] Support std::regex_constants::match_not_null
Tim Shen via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 21 13:51:13 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL284881: [libcxx] Support std::regex_constants::match_not_null (authored by timshen).
Changed prior to commit:
https://reviews.llvm.org/D25595?vs=75186&id=75480#toc
Repository:
rL LLVM
https://reviews.llvm.org/D25595
Files:
libcxx/trunk/include/regex
libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
Index: libcxx/trunk/include/regex
===================================================================
--- libcxx/trunk/include/regex
+++ libcxx/trunk/include/regex
@@ -5555,6 +5555,12 @@
switch (__s.__do_)
{
case __state::__end_state:
+ if (__flags & regex_constants::match_not_null &&
+ __s.__current_ == __first)
+ {
+ __states.pop_back();
+ break;
+ }
__m.__matches_[0].first = __first;
__m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
__m.__matches_[0].matched = true;
@@ -5618,6 +5624,12 @@
switch (__s.__do_)
{
case __state::__end_state:
+ if (__flags & regex_constants::match_not_null &&
+ __s.__current_ == __first)
+ {
+ __states.pop_back();
+ break;
+ }
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
__highest_j = __s.__current_ - __s.__first_;
__matched = true;
@@ -5703,6 +5715,12 @@
switch (__s.__do_)
{
case __state::__end_state:
+ if (__flags & regex_constants::match_not_null &&
+ __s.__current_ == __first)
+ {
+ __states.pop_back();
+ break;
+ }
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
{
__highest_j = __s.__current_ - __s.__first_;
Index: libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
===================================================================
--- libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
+++ libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// match_not_null:
+// The regular expression shall not match an empty sequence.
+
+#include "test_macros.h"
+#include <cassert>
+#include <regex>
+
+int main()
+{
+ // When match_not_null is on, the regex engine should reject empty matches and
+ // move on to try other solutions.
+ std::cmatch m;
+ assert(!std::regex_search("a", m, std::regex("b*"),
+ std::regex_constants::match_not_null));
+ assert(std::regex_search("aa", m, std::regex("a*?"),
+ std::regex_constants::match_not_null));
+ assert(m[0].length() == 1);
+ assert(!std::regex_search("a", m, std::regex("b*", std::regex::extended),
+ std::regex_constants::match_not_null));
+ assert(!std::regex_search(
+ "a", m,
+ std::regex("b*", std::regex::extended | std::regex_constants::nosubs),
+ std::regex_constants::match_not_null));
+
+ assert(!std::regex_match("", m, std::regex("a*"),
+ std::regex_constants::match_not_null));
+ assert(!std::regex_match("", m, std::regex("a*", std::regex::extended),
+ std::regex_constants::match_not_null));
+ assert(!std::regex_match(
+ "", m,
+ std::regex("a*", std::regex::extended | std::regex_constants::nosubs),
+ std::regex_constants::match_not_null));
+
+ return 0;
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25595.75480.patch
Type: text/x-patch
Size: 3736 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161021/9ae9fad9/attachment.bin>
More information about the cfe-commits
mailing list