Re: [Patch, libstdc++/64302, libstdc++/64303] Fix match_results iterators and regex_token_iterator

2014-12-15 Thread Jonathan Wakely

On 14/12/14 15:23 -0800, Tim Shen wrote:

Bootstraped and tested :)

I'm not sure if it's safe to directly backport it to 4.9, since one
inline function (_M_normalize_result) is added; but at least we can
manually inline them by copy  paste.


It's OK for trunk and 4.9, without changes.

Code compiled against 4.9.2 that inlines some of the regex code won't
be affected by the added function. Code that doesn't inline the code
will start calling the new function. So it won't hurt and might help.


[Patch, libstdc++/64302, libstdc++/64303] Fix match_results iterators and regex_token_iterator

2014-12-14 Thread Tim Shen
Bootstraped and tested :)

I'm not sure if it's safe to directly backport it to 4.9, since one
inline function (_M_normalize_result) is added; but at least we can
manually inline them by copy  paste.


-- 
Regards,
Tim Shen
commit 6be0eb9cfb66c0229c7121890371f9d45189321d
Author: timshen tims...@google.com
Date:   Sun Dec 14 14:00:08 2014 -0800

PR libstdc++/64302
PR libstdc++/64303
* include/bits/regex.h (match_results::cbegin, match_results::cend,
regex_token_iterator::regex_token_iterator,
regex_token_iterator::_M_normalize_result): Fix match_results cbegin
and cend and regex_token_iterator::_M_result invariant.
* include/bits/regex.tcc: Fix regex_token_iterator::_M_result invariant.
* testsuite/28_regex/iterators/regex_token_iterator/64303.cc: Testcase.

diff --git a/libstdc++-v3/include/bits/regex.h 
b/libstdc++-v3/include/bits/regex.h
index 3afec37..80b1de8 100644
--- a/libstdc++-v3/include/bits/regex.h
+++ b/libstdc++-v3/include/bits/regex.h
@@ -1756,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*/
   const_iterator
   cbegin() const
-  { return _Base_type::cbegin() + 2; }
+  { return this-begin(); }
 
   /**
* @brief Gets an iterator to one-past-the-end of the collection.
@@ -1770,7 +1770,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*/
   const_iterator
   cend() const
-  { return _Base_type::cend(); }
+  { return this-end(); }
 
   //@}
 
@@ -2632,7 +2632,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 regex_constants::match_flag_type __m
 = regex_constants::match_default)
   : _M_position(__a, __b, __re, __m),
-  _M_subs(__submatches, *(__submatches+1)), _M_n(0)
+  _M_subs(__submatches, __submatches + _Nm), _M_n(0)
   { _M_init(__a, __b); }
 
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -2660,12 +2660,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*/
   regex_token_iterator(const regex_token_iterator __rhs)
   : _M_position(__rhs._M_position), _M_subs(__rhs._M_subs),
-  _M_suffix(__rhs._M_suffix), _M_n(__rhs._M_n), _M_result(__rhs._M_result),
-  _M_has_m1(__rhs._M_has_m1)
-  {
-   if (__rhs._M_result == __rhs._M_suffix)
- _M_result = _M_suffix;
-  }
+  _M_suffix(__rhs._M_suffix), _M_n(__rhs._M_n), _M_has_m1(__rhs._M_has_m1)
+  { _M_normalize_result(); }
 
   /**
* @brief Assigns a %regex_token_iterator to another.
@@ -2737,6 +2733,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   _M_end_of_seq() const
   { return _M_result == nullptr; }
 
+  // [28.12.2.2.4]
+  void
+  _M_normalize_result()
+  {
+   if (_M_position != _Position())
+ _M_result = _M_current_match();
+   else if (_M_has_m1)
+ _M_result = _M_suffix;
+   else
+ _M_result = nullptr;
+  }
+
   _Position _M_position;
   std::vectorint  _M_subs;
   value_type_M_suffix;
diff --git a/libstdc++-v3/include/bits/regex.tcc 
b/libstdc++-v3/include/bits/regex.tcc
index b676428..0206a6c 100644
--- a/libstdc++-v3/include/bits/regex.tcc
+++ b/libstdc++-v3/include/bits/regex.tcc
@@ -607,11 +607,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   _M_position = __rhs._M_position;
   _M_subs = __rhs._M_subs;
   _M_n = __rhs._M_n;
-  _M_result = __rhs._M_result;
   _M_suffix = __rhs._M_suffix;
   _M_has_m1 = __rhs._M_has_m1;
-  if (__rhs._M_result == __rhs._M_suffix)
-   _M_result = _M_suffix;
+  _M_normalize_result();
   return *this;
 }
 
diff --git 
a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/64303.cc 
b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/64303.cc
new file mode 100644
index 000..f09bbe1
--- /dev/null
+++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/64303.cc
@@ -0,0 +1,49 @@
+// { dg-do run }
+// { dg-options -std=gnu++11 }
+
+//
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// http://www.gnu.org/licenses/.
+
+// 28.12.2 Class template regex_token_iterator
+
+#include regex
+#include testsuite_hooks.h
+
+void
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::string s(  111  222  );
+  const std::regex re(\\w+);
+
+