re PR libstdc++/64657 (Support iterators with overloaded operator-comma)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 Apr 2015 15:22:13 +0000 (16:22 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 29 Apr 2015 15:22:13 +0000 (16:22 +0100)
PR libstdc++/64657
* include/bits/basic_string (basic_string::_S_copy_chars): Cast
expression to void.
* include/bits/locale_facets_nonio.tcc (money_get::_M_extract,
time_get::_M_extract_num, time_get::_M_extract_name,
time_get::_M_extract_wday_or_month): Likewise.
* include/bits/stl_algo.h (__includes, __replace_copy_if,
__is_sorted_until, __is_permutation, transform): Likewise.
* include/bits/stl_algobase.h (swap_ranges, __copy_move::__copy_m,
__equal::equal, __lexicographical_compare_impl, equal): Likewise.
* include/bits/stl_numeric.h (inner_product): Likewise.
* include/bits/stl_uninitialized.h (__uninitialized_copy_a): Likewise.
* testsuite/util/testsuite_iterators.h (output_iterator_wrapper,
input_iterator_wrapper): Declare unusable comma operator.
* testsuite/21_strings/basic_string/cons/char/64657.cc: New.
* testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc:
New.

From-SVN: r222579

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/bits/locale_facets_nonio.tcc
libstdc++-v3/include/bits/stl_algo.h
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/include/bits/stl_numeric.h
libstdc++-v3/include/bits/stl_uninitialized.h
libstdc++-v3/testsuite/21_strings/basic_string/cons/char/64657.cc [new file with mode: 0644]
libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc [new file with mode: 0644]
libstdc++-v3/testsuite/util/testsuite_iterators.h

index 5c7eb2c3c9102005b4869a20bea2bba8cc85c430..fde307fb9edcca1dc85f99f6ccef6ccdfcaf9a82 100644 (file)
@@ -1,3 +1,23 @@
+2015-04-29  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/64657
+       * include/bits/basic_string (basic_string::_S_copy_chars): Cast
+       expression to void.
+       * include/bits/locale_facets_nonio.tcc (money_get::_M_extract,
+       time_get::_M_extract_num, time_get::_M_extract_name,
+       time_get::_M_extract_wday_or_month): Likewise.
+       * include/bits/stl_algo.h (__includes, __replace_copy_if,
+       __is_sorted_until, __is_permutation, transform): Likewise.
+       * include/bits/stl_algobase.h (swap_ranges, __copy_move::__copy_m,
+       __equal::equal, __lexicographical_compare_impl, equal): Likewise.
+       * include/bits/stl_numeric.h (inner_product): Likewise.
+       * include/bits/stl_uninitialized.h (__uninitialized_copy_a): Likewise.
+       * testsuite/util/testsuite_iterators.h (output_iterator_wrapper,
+       input_iterator_wrapper): Declare unusable comma operator.
+       * testsuite/21_strings/basic_string/cons/char/64657.cc: New.
+       * testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc:
+       New.
+
 2015-04-28  Doug Evans  <dje@google.com>
 
        * testsuite/libstdc++-xmethods/list.cc (_GLIBCXX_USE_CXX11_ABI):
index 3b2603fc650792051300861a7a8f915fecb62f9e..3e3eef44b4a14bc937a4a620e532bcb9a39abd08 100644 (file)
@@ -324,7 +324,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
        _GLIBCXX_NOEXCEPT
         {
-         for (; __k1 != __k2; ++__k1, ++__p)
+         for (; __k1 != __k2; ++__k1, (void)++__p)
            traits_type::assign(*__p, *__k1); // These types are off.
        }
 
@@ -2779,7 +2779,7 @@ _GLIBCXX_END_NAMESPACE_CXX11
         _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
        _GLIBCXX_NOEXCEPT
         {
-         for (; __k1 != __k2; ++__k1, ++__p)
+         for (; __k1 != __k2; ++__k1, (void)++__p)
            traits_type::assign(*__p, *__k1); // These types are off.
        }
 
index 188d07bd7c098f1cba666622ff7f65e29ccb1869..2e73b5d2af051b100061d457fd35148836eca551 100644 (file)
@@ -202,7 +202,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11
                    size_type __j = 0;
                    for (; __beg != __end && __j < __len
                           && *__beg == __lc->_M_curr_symbol[__j];
-                        ++__beg, ++__j);
+                        ++__beg, (void)++__j);
                    if (__j != __len
                        && (__j || __io.flags() & ios_base::showbase))
                      __testvalid = false;
@@ -298,7 +298,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11
                                                 : __lc->_M_positive_sign;
            size_type __i = 1;
            for (; __beg != __end && __i < __sign_size
-                  && *__beg == __sign[__i]; ++__beg, ++__i);
+                  && *__beg == __sign[__i]; ++__beg, (void)++__i);
            
            if (__i != __sign_size)
              __testvalid = false;
@@ -858,7 +858,7 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
       ++__min;
       size_t __i = 0;
       int __value = 0;
-      for (; __beg != __end && __i < __len; ++__beg, ++__i)
+      for (; __beg != __end && __i < __len; ++__beg, (void)++__i)
        {
          const char __c = __ctype.narrow(*__beg, '*');
          if (__c >= '0' && __c <= '9')
@@ -923,7 +923,8 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
          for (size_t __i2 = 1; __i2 < __nmatches; ++__i2)
            __minlen = std::min(__minlen,
                              __traits_type::length(__names[__matches[__i2]]));
-         ++__beg, ++__pos;
+         ++__beg;
+         ++__pos;
          if (__pos < __minlen && __beg != __end)
            for (size_t __i3 = 0; __i3 < __nmatches;)
              {
@@ -940,11 +941,12 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
       if (__nmatches == 1)
        {
          // Make sure found name is completely extracted.
-         ++__beg, ++__pos;
+         ++__beg;
+         ++__pos;
          __name = __names[__matches[0]];
          const size_t __len = __traits_type::length(__name);
          while (__pos < __len && __beg != __end && __name[__pos] == *__beg)
-           ++__beg, ++__pos;
+           ++__beg, (void)++__pos;
 
          if (__len == __pos)
            __member = __matches[0];
@@ -987,7 +989,8 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
 
       if (__nmatches)
        {
-         ++__beg, ++__pos;
+         ++__beg;
+         ++__pos;
 
          __matches_lengths
            = static_cast<size_t*>(__builtin_alloca(sizeof(size_t)
@@ -997,7 +1000,7 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
              = __traits_type::length(__names[__matches[__i]]);
        }
 
-      for (; __beg != __end; ++__beg, ++__pos)
+      for (; __beg != __end; ++__beg, (void)++__pos)
        {
          size_t __nskipped = 0;
          const char_type __c = *__beg;
index 56cc743ebe797981157f33d4164b257cedb56d9f..93e834abeb7889cbc3aa2b6255bacead6c24bfcc 100644 (file)
@@ -2805,7 +2805,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        else if (__comp(__first1, __first2))
          ++__first1;
        else
-         ++__first1, ++__first2;
+         {
+           ++__first1;
+           ++__first2;
+         }
 
       return __first2 == __last2;
     }
@@ -3108,7 +3111,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                      _OutputIterator __result,
                      _Predicate __pred, const _Tp& __new_value)
     {
-      for (; __first != __last; ++__first, ++__result)
+      for (; __first != __last; ++__first, (void)++__result)
        if (__pred(__first))
          *__result = __new_value;
        else
@@ -3232,7 +3235,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        return __last;
 
       _ForwardIterator __next = __first;
-      for (++__next; __next != __last; __first = __next, ++__next)
+      for (++__next; __next != __last; __first = __next, (void)++__next)
        if (__comp(__next, __first))
          return __next;
       return __next;
@@ -3491,7 +3494,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       // Efficiently compare identical prefixes:  O(N) if sequences
       // have the same elements in the same order.
-      for (; __first1 != __last1; ++__first1, ++__first2)
+      for (; __first1 != __last1; ++__first1, (void)++__first2)
        if (!__pred(__first1, __first2))
          break;
 
@@ -3607,7 +3610,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // Efficiently compare identical prefixes:  O(N) if sequences
       // have the same elements in the same order.
       for (; __first1 != __last1 && __first2 != __last2;
-         ++__first1, ++__first2)
+         ++__first1, (void)++__first2)
        if (!__pred(__first1, __first2))
          break;
 
@@ -4171,7 +4174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
             __typeof__(__unary_op(*__first))>)
       __glibcxx_requires_valid_range(__first, __last);
 
-      for (; __first != __last; ++__first, ++__result)
+      for (; __first != __last; ++__first, (void)++__result)
        *__result = __unary_op(*__first);
       return __result;
     }
@@ -4210,7 +4213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
             __typeof__(__binary_op(*__first1,*__first2))>)
       __glibcxx_requires_valid_range(__first1, __last1);
 
-      for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
+      for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
        *__result = __binary_op(*__first1, *__first2);
       return __result;
     }
index 90401350d94904337c6839be1ecfa45ca9f82137..c82d96d25bbff043c78a169d04e2a2cda7983e50 100644 (file)
@@ -173,7 +173,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                  _ForwardIterator2>)
       __glibcxx_requires_valid_range(__first1, __last1);
 
-      for (; __first1 != __last1; ++__first1, ++__first2)
+      for (; __first1 != __last1; ++__first1, (void)++__first2)
        std::iter_swap(__first1, __first2);
       return __first2;
     }
@@ -306,7 +306,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         static _OI
         __copy_m(_II __first, _II __last, _OI __result)
         {
-         for (; __first != __last; ++__result, ++__first)
+         for (; __first != __last; ++__result, (void)++__first)
            *__result = *__first;
          return __result;
        }
@@ -320,7 +320,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         static _OI
         __copy_m(_II __first, _II __last, _OI __result)
         {
-         for (; __first != __last; ++__result, ++__first)
+         for (; __first != __last; ++__result, (void)++__first)
            *__result = std::move(*__first);
          return __result;
        }
@@ -808,7 +808,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         static bool
         equal(_II1 __first1, _II1 __last1, _II2 __first2)
         {
-         for (; __first1 != __last1; ++__first1, ++__first2)
+         for (; __first1 != __last1; ++__first1, (void)++__first2)
            if (!(*__first1 == *__first2))
              return false;
          return true;
@@ -889,7 +889,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
       for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
-          ++__first1, ++__first2)
+          ++__first1, (void)++__first2)
        {
          if (__comp(__first1, __first2))
            return true;
@@ -1088,7 +1088,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
       __glibcxx_function_requires(_InputIteratorConcept<_IIter2>)
       __glibcxx_requires_valid_range(__first1, __last1);
 
-      for (; __first1 != __last1; ++__first1, ++__first2)
+      for (; __first1 != __last1; ++__first1, (void)++__first2)
        if (!bool(__binary_pred(*__first1, *__first2)))
          return false;
       return true;
@@ -1137,7 +1137,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
          return _GLIBCXX_STD_A::equal(__first1, __last1, __first2);
        }
 
-      for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+      for (; __first1 != __last1 && __first2 != __last2;
+         ++__first1, (void)++__first2)
        if (!(*__first1 == *__first2))
          return false;
       return __first1 == __last1 && __first2 == __last2;
@@ -1184,7 +1185,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
                                       __binary_pred);
        }
 
-      for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+      for (; __first1 != __last1 && __first2 != __last2;
+         ++__first1, (void)++__first2)
        if (!bool(__binary_pred(*__first1, *__first2)))
          return false;
       return __first1 == __last1 && __first2 == __last2;
index 8ad78fb46d55bfa2f8947cd384c1aad2205db053..b8e068e81bad16b5dfb8538a9bd77e1c0329741f 100644 (file)
@@ -179,7 +179,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
       __glibcxx_requires_valid_range(__first1, __last1);
 
-      for (; __first1 != __last1; ++__first1, ++__first2)
+      for (; __first1 != __last1; ++__first1, (void)++__first2)
        __init = __init + (*__first1 * *__first2);
       return __init;
     }
@@ -213,7 +213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
       __glibcxx_requires_valid_range(__first1, __last1);
 
-      for (; __first1 != __last1; ++__first1, ++__first2)
+      for (; __first1 != __last1; ++__first1, (void)++__first2)
        __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
       return __init;
     }
index 61a15618f43795899e688e7536683481cdf2cbb5..715cb58de5ed78d0078f5e4118d5e302298a8862 100644 (file)
@@ -263,7 +263,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __try
        {
          typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
-         for (; __first != __last; ++__first, ++__cur)
+         for (; __first != __last; ++__first, (void)++__cur)
            __traits::construct(__alloc, std::__addressof(*__cur), *__first);
          return __cur;
        }
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/64657.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/64657.cc
new file mode 100644 (file)
index 0000000..6f0777f
--- /dev/null
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 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/>.
+
+// { dg-do compile }
+
+#include <string>
+#include <testsuite_iterators.h>
+
+void
+test01()
+{
+  using namespace __gnu_test;
+  char* p = 0;
+  test_container<char, forward_iterator_wrapper> c(p, p);
+  std::string s(c.begin(), c.end());
+}
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc
new file mode 100644 (file)
index 0000000..b3cac9a
--- /dev/null
@@ -0,0 +1,31 @@
+// Copyright (C) 2015 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/>.
+
+// { dg-do compile }
+
+#include <string>
+#include <testsuite_iterators.h>
+
+void
+test01()
+{
+  using namespace __gnu_test;
+  char* p = 0;
+  test_container<char, forward_iterator_wrapper> c(p, p);
+  std::string s;
+  s.assign(c.begin(), c.end());
+}
index 55ca0a204d18b9a3231544adce3542df04588590..d899d8d97bbf43f948402594b53df84928c09873 100644 (file)
@@ -170,6 +170,14 @@ namespace __gnu_test
       return tmp;
     }
 
+#if __cplusplus >= 201103L
+    template<typename U>
+      void operator,(const U&) const = delete;
+#else
+  private:
+    template<typename U>
+      void operator,(const U&) const;
+#endif
   };
 
   /**
@@ -251,6 +259,15 @@ namespace __gnu_test
     {
       ++*this;
     }
+
+#if __cplusplus >= 201103L
+    template<typename U>
+      void operator,(const U&) const = delete;
+#else
+  private:
+    template<typename U>
+      void operator,(const U&) const;
+#endif
   };
 
 
@@ -306,7 +323,7 @@ namespace __gnu_test
       ++*this;
       return tmp;
     }
-   };
+  };
 
   /**
    * @brief bidirectional_iterator wrapper for pointer
@@ -370,7 +387,7 @@ namespace __gnu_test
       --*this;
       return tmp;
     }
-   };
+  };
 
   /**
    * @brief random_access_iterator wrapper for pointer
@@ -498,7 +515,7 @@ namespace __gnu_test
     {
       return !(*this > in);
     }
-   };
+  };
 
   template<typename T>
     random_access_iterator_wrapper<T>