PR libstdc++/83600 fix end iterator for unready std::match_results
authorJonathan Wakely <jwakely@redhat.com>
Wed, 27 Dec 2017 22:18:08 +0000 (22:18 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 27 Dec 2017 22:18:08 +0000 (22:18 +0000)
PR libstdc++/83600
* include/bits/regex.h (match_results::end()): Return valid iterator
when not ready.
* testsuite/28_regex/match_results/ctors/char/default.cc: Check that
unready objects are empty and have equal begin and end iterators.
* testsuite/28_regex/match_results/ctors/wchar_t/default.cc: Likewise.

From-SVN: r256014

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/regex.h
libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc
libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc

index 4474f5e5d0f696ee0732cd3ee03ca639b51a8761..8594670570ef0bc5b000c5cef182bed0002c8ed2 100644 (file)
@@ -1,5 +1,12 @@
 2017-12-27  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/83600
+       * include/bits/regex.h (match_results::end()): Return valid iterator
+       when not ready.
+       * testsuite/28_regex/match_results/ctors/char/default.cc: Check that
+       unready objects are empty and have equal begin and end iterators.
+       * testsuite/28_regex/match_results/ctors/wchar_t/default.cc: Likewise.
+
        PR libstdc++/83598
        * include/bits/regex.h (basic_regex): Don't modify flags passed to
        constructors.
index 0d97d535e2af79f9dca12096a63d69be26de16c4..d85be41f830b3611b11d8d96756c79e4254869df 100644 (file)
@@ -1749,7 +1749,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        */
       const_iterator
       end() const
-      { return _Base_type::end() - 3; }
+      { return _Base_type::end() - (empty() ? 0 : 3); }
 
       /**
        * @brief Gets an iterator to one-past-the-end of the collection.
index a6d1375df9e40233a06bb3331fdb29c38f299223..c2177580ebb4fd1d43b5d71ed8d708fd9920b795 100644 (file)
@@ -30,6 +30,8 @@ void test01()
   std::cmatch cm;
   VERIFY( cm.size() == 0 );
   VERIFY( !cm.ready() );
+  VERIFY( cm.empty() );
+  VERIFY( cm.begin() == cm.end() ); // PR libstdc++/83600
 }
 
 void test02()
@@ -37,6 +39,8 @@ void test02()
   std::smatch sm;
   VERIFY( sm.size() == 0 );
   VERIFY( !sm.ready() );
+  VERIFY( sm.empty() );
+  VERIFY( sm.begin() == sm.end() ); // PR libstdc++/83600
 }
 
 int
index f1d0a3f1191a5ef3868f9f5ba141d392bc5a00e6..22e25e13f391b7ca2aebc0529ae5f1b714881bd1 100644 (file)
@@ -30,6 +30,8 @@ void test01()
   std::wcmatch cm;
   VERIFY( cm.size() == 0 );
   VERIFY( !cm.ready() );
+  VERIFY( cm.empty() );
+  VERIFY( cm.begin() == cm.end() ); // PR libstdc++/83600
 }
 
 void test02()
@@ -37,6 +39,8 @@ void test02()
   std::wsmatch sm;
   VERIFY( sm.size() == 0 );
   VERIFY( !sm.ready() );
+  VERIFY( sm.empty() );
+  VERIFY( sm.begin() == sm.end() ); // PR libstdc++/83600
 }
 
 int