From f970a17d6fc79eda660c78632ceff35d814933a8 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 29 Apr 2015 16:22:13 +0100 Subject: [PATCH] re PR libstdc++/64657 (Support iterators with overloaded operator-comma) 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 | 20 ++++++++++++ libstdc++-v3/include/bits/basic_string.h | 4 +-- .../include/bits/locale_facets_nonio.tcc | 19 +++++++----- libstdc++-v3/include/bits/stl_algo.h | 17 +++++----- libstdc++-v3/include/bits/stl_algobase.h | 18 ++++++----- libstdc++-v3/include/bits/stl_numeric.h | 4 +-- libstdc++-v3/include/bits/stl_uninitialized.h | 2 +- .../basic_string/cons/char/64657.cc | 30 ++++++++++++++++++ .../modifiers/assign/char/64657.cc | 31 +++++++++++++++++++ .../testsuite/util/testsuite_iterators.h | 23 ++++++++++++-- 10 files changed, 137 insertions(+), 31 deletions(-) create mode 100644 libstdc++-v3/testsuite/21_strings/basic_string/cons/char/64657.cc create mode 100644 libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5c7eb2c3c91..fde307fb9ed 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,23 @@ +2015-04-29 Jonathan Wakely + + 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 * testsuite/libstdc++-xmethods/list.cc (_GLIBCXX_USE_CXX11_ABI): diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 3b2603fc650..3e3eef44b4a 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -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. } diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.tcc b/libstdc++-v3/include/bits/locale_facets_nonio.tcc index 188d07bd7c0..2e73b5d2af0 100644 --- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc +++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc @@ -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(__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; diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 56cc743ebe7..93e834abeb7 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -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; } diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index 90401350d94..c82d96d25bb 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -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; diff --git a/libstdc++-v3/include/bits/stl_numeric.h b/libstdc++-v3/include/bits/stl_numeric.h index 8ad78fb46d5..b8e068e81ba 100644 --- a/libstdc++-v3/include/bits/stl_numeric.h +++ b/libstdc++-v3/include/bits/stl_numeric.h @@ -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; } diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h b/libstdc++-v3/include/bits/stl_uninitialized.h index 61a15618f43..715cb58de5e 100644 --- a/libstdc++-v3/include/bits/stl_uninitialized.h +++ b/libstdc++-v3/include/bits/stl_uninitialized.h @@ -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 index 00000000000..6f0777f6569 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/64657.cc @@ -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 +// . + +// { dg-do compile } + +#include +#include + +void +test01() +{ + using namespace __gnu_test; + char* p = 0; + test_container 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 index 00000000000..b3cac9abb5a --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/assign/char/64657.cc @@ -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 +// . + +// { dg-do compile } + +#include +#include + +void +test01() +{ + using namespace __gnu_test; + char* p = 0; + test_container c(p, p); + std::string s; + s.assign(c.begin(), c.end()); +} diff --git a/libstdc++-v3/testsuite/util/testsuite_iterators.h b/libstdc++-v3/testsuite/util/testsuite_iterators.h index 55ca0a204d1..d899d8d97bb 100644 --- a/libstdc++-v3/testsuite/util/testsuite_iterators.h +++ b/libstdc++-v3/testsuite/util/testsuite_iterators.h @@ -170,6 +170,14 @@ namespace __gnu_test return tmp; } +#if __cplusplus >= 201103L + template + void operator,(const U&) const = delete; +#else + private: + template + void operator,(const U&) const; +#endif }; /** @@ -251,6 +259,15 @@ namespace __gnu_test { ++*this; } + +#if __cplusplus >= 201103L + template + void operator,(const U&) const = delete; +#else + private: + template + 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 random_access_iterator_wrapper -- 2.30.2