[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

llvm-svn: 284881
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: abd1a6e687b7d4b332dc2fa35526a6e8de5f3857
diff --git a/include/regex b/include/regex
index f8fb6af..975f640 100644
--- a/include/regex
+++ b/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_;