Fix a bug in regex_Iterator where it would report zero-length matches forever. Reported as http://llvm.org/PR33681. Thanks to Karen Arutyunov for the report.

llvm-svn: 307171
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 52f4f72fa95ac0e3baf21be658a4005f265358c7
diff --git a/include/regex b/include/regex
index 443c2e3..77ca648 100644
--- a/include/regex
+++ b/include/regex
@@ -6142,7 +6142,7 @@
 {
     __flags_ |= regex_constants::__no_update_pos;
     _BidirectionalIterator __start = __match_[0].second;
-    if (__match_.empty())
+    if (__match_[0].first == __match_[0].second)
     {
         if (__start == __end_)
         {
diff --git a/test/std/re/re.iter/re.regiter/re.regiter.incr/post.pass.cpp b/test/std/re/re.iter/re.regiter/re.regiter.incr/post.pass.cpp
index f3b57f6..5e3ad4d 100644
--- a/test/std/re/re.iter/re.regiter/re.regiter.incr/post.pass.cpp
+++ b/test/std/re/re.iter/re.regiter/re.regiter.incr/post.pass.cpp
@@ -95,4 +95,22 @@
         assert((*i2).position() == 0);
         assert((*i2).str() == "555-1234");
     }
+    { // http://llvm.org/PR33681
+        std::regex rex(".*");
+        const char foo[] = "foo";
+    //  The -1 is because we don't want the implicit null from the array.
+        std::cregex_iterator i(std::begin(foo), std::end(foo) - 1, rex);
+        std::cregex_iterator e;
+        assert(i != e);
+        assert((*i).size() == 1);
+        assert((*i).str() == "foo");
+
+        ++i;
+        assert(i != e);
+        assert((*i).size() == 1);
+        assert((*i).str() == "");
+
+        ++i;
+        assert(i == e);
+    }
 }