[libcxx] r284881 - [libcxx] Support std::regex_constants::match_not_null

Tim Shen via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 21 13:41:48 PDT 2016


Author: timshen
Date: Fri Oct 21 15:41:47 2016
New Revision: 284881

URL: http://llvm.org/viewvc/llvm-project?rev=284881&view=rev
Log:
[libcxx] Support std::regex_constants::match_not_null

Summary: Fixes PR21597.

Reviewers: mclow.lists, EricWF

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D25595

Added:
    libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
Modified:
    libcxx/trunk/include/regex

Modified: libcxx/trunk/include/regex
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/regex?rev=284881&r1=284880&r2=284881&view=diff
==============================================================================
--- libcxx/trunk/include/regex (original)
+++ libcxx/trunk/include/regex Fri Oct 21 15:41:47 2016
@@ -5555,6 +5555,12 @@ basic_regex<_CharT, _Traits>::__match_at
             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 @@ basic_regex<_CharT, _Traits>::__match_at
             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 @@ basic_regex<_CharT, _Traits>::__match_at
             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_;

Added: libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp?rev=284881&view=auto
==============================================================================
--- libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp (added)
+++ libcxx/trunk/test/std/re/re.const/re.matchflag/match_not_null.pass.cpp Fri Oct 21 15:41:47 2016
@@ -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;
+}




More information about the cfe-commits mailing list