[libcxx] Fix use of operator comma where the types can be user defined

Summary:
An evil user might overload operator comma. Use a void cast to make sure any user overload is not selected.
Modify all the test iterators to define operator comma. 

Reviewers: danalbert, mclow.lists

Reviewed By: mclow.lists

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D5929

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@220706 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier 2014-10-27 19:28:20 +00:00
parent 1d306de1a7
commit b991975439
9 changed files with 51 additions and 36 deletions

View File

@ -1189,7 +1189,7 @@ inline _LIBCPP_INLINE_VISIBILITY
bool bool
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
{ {
for (; __first1 != __last1; ++__first1, ++__first2) for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2)) if (!__pred(*__first1, *__first2))
return false; return false;
return true; return true;
@ -1213,7 +1213,7 @@ __equal(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred, _InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
input_iterator_tag, input_iterator_tag ) input_iterator_tag, input_iterator_tag )
{ {
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2) for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2)) if (!__pred(*__first1, *__first2))
return false; return false;
return __first1 == __last1 && __first2 == __last2; return __first1 == __last1 && __first2 == __last2;
@ -1267,7 +1267,7 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _BinaryPredicate __pred) _ForwardIterator2 __first2, _BinaryPredicate __pred)
{ {
// shorten sequences as much as possible by lopping of any equal parts // shorten sequences as much as possible by lopping of any equal parts
for (; __first1 != __last1; ++__first1, ++__first2) for (; __first1 != __last1; ++__first1, (void) ++__first2)
if (!__pred(*__first1, *__first2)) if (!__pred(*__first1, *__first2))
goto __not_done; goto __not_done;
return true; return true;
@ -1745,7 +1745,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator _OutputIterator
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) __copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{ {
for (; __first != __last; ++__first, ++__result) for (; __first != __last; ++__first, (void) ++__result)
*__result = *__first; *__result = *__first;
return __result; return __result;
} }
@ -1874,7 +1874,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator _OutputIterator
__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) __move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
{ {
for (; __first != __last; ++__first, ++__result) for (; __first != __last; ++__first, (void) ++__result)
*__result = _VSTD::move(*__first); *__result = _VSTD::move(*__first);
return __result; return __result;
} }
@ -1950,7 +1950,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator _OutputIterator
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
{ {
for (; __first != __last; ++__first, ++__result) for (; __first != __last; ++__first, (void) ++__result)
*__result = __op(*__first); *__result = __op(*__first);
return __result; return __result;
} }
@ -1961,7 +1961,7 @@ _OutputIterator
transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
_OutputIterator __result, _BinaryOperation __binary_op) _OutputIterator __result, _BinaryOperation __binary_op)
{ {
for (; __first1 != __last1; ++__first1, ++__first2, ++__result) for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
*__result = __binary_op(*__first1, *__first2); *__result = __binary_op(*__first1, *__first2);
return __result; return __result;
} }
@ -1998,7 +1998,7 @@ _OutputIterator
replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
const _Tp& __old_value, const _Tp& __new_value) const _Tp& __old_value, const _Tp& __new_value)
{ {
for (; __first != __last; ++__first, ++__result) for (; __first != __last; ++__first, (void) ++__result)
if (*__first == __old_value) if (*__first == __old_value)
*__result = __new_value; *__result = __new_value;
else else
@ -2014,7 +2014,7 @@ _OutputIterator
replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
_Predicate __pred, const _Tp& __new_value) _Predicate __pred, const _Tp& __new_value)
{ {
for (; __first != __last; ++__first, ++__result) for (; __first != __last; ++__first, (void) ++__result)
if (__pred(*__first)) if (__pred(*__first))
*__result = __new_value; *__result = __new_value;
else else
@ -2029,7 +2029,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator _OutputIterator
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_) __fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
{ {
for (; __n > 0; ++__first, --__n) for (; __n > 0; ++__first, (void) --__n)
*__first = __value_; *__first = __value_;
return __first; return __first;
} }
@ -2103,7 +2103,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator _OutputIterator
generate_n(_OutputIterator __first, _Size __n, _Generator __gen) generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
{ {
for (; __n > 0; ++__first, --__n) for (; __n > 0; ++__first, (void) --__n)
*__first = __gen(); *__first = __gen();
return __first; return __first;
} }
@ -4372,7 +4372,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
if (__len1 <= __len2) if (__len1 <= __len2)
{ {
value_type* __p = __buff; value_type* __p = __buff;
for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p) for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
::new(__p) value_type(_VSTD::move(*__i)); ::new(__p) value_type(_VSTD::move(*__i));
__merge<_Compare>(move_iterator<value_type*>(__buff), __merge<_Compare>(move_iterator<value_type*>(__buff),
move_iterator<value_type*>(__p), move_iterator<value_type*>(__p),
@ -4383,7 +4383,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
else else
{ {
value_type* __p = __buff; value_type* __p = __buff;
for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p) for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
::new(__p) value_type(_VSTD::move(*__i)); ::new(__p) value_type(_VSTD::move(*__i));
typedef reverse_iterator<_BidirectionalIterator> _RBi; typedef reverse_iterator<_BidirectionalIterator> _RBi;
typedef reverse_iterator<value_type*> _Rv; typedef reverse_iterator<value_type*> _Rv;
@ -4408,7 +4408,7 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
if (__len2 == 0) if (__len2 == 0)
return; return;
// shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0 // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
for (; true; ++__first, --__len1) for (; true; ++__first, (void) --__len1)
{ {
if (__len1 == 0) if (__len1 == 0)
return; return;
@ -5067,7 +5067,7 @@ __partial_sort_copy(_InputIterator __first, _InputIterator __last,
_RandomAccessIterator __r = __result_first; _RandomAccessIterator __r = __result_first;
if (__r != __result_last) if (__r != __result_last)
{ {
for (; __first != __last && __r != __result_last; ++__first, ++__r) for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
*__r = *__first; *__r = *__first;
__make_heap<_Compare>(__result_first, __r, __comp); __make_heap<_Compare>(__result_first, __r, __comp);
typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first; typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
@ -5589,7 +5589,7 @@ bool
__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, __lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
{ {
for (; __first2 != __last2; ++__first1, ++__first2) for (; __first2 != __last2; ++__first1, (void) ++__first2)
{ {
if (__first1 == __last1 || __comp(*__first1, *__first2)) if (__first1 == __last1 || __comp(*__first1, *__first2))
return true; return true;

View File

@ -1588,7 +1588,7 @@ deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
{ {
iterator __i = __base::begin(); iterator __i = __base::begin();
iterator __e = __base::end(); iterator __e = __base::end();
for (; __f != __l && __i != __e; ++__f, ++__i) for (; __f != __l && __i != __e; ++__f, (void) ++__i)
*__i = *__f; *__i = *__f;
if (__f != __l) if (__f != __l)
__append(__f, __l); __append(__f, __l);
@ -2160,7 +2160,7 @@ deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
if (__n > __de) if (__n > __de)
{ {
__m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de); __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
for (_BiIter __j = __m; __j != __l; ++__i, ++__j, ++__base::size()) for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j); __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
__n = __de; __n = __de;
} }
@ -2200,7 +2200,7 @@ deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
if (__n > __back_capacity) if (__n > __back_capacity)
__add_back_capacity(__n - __back_capacity); __add_back_capacity(__n - __back_capacity);
// __n <= __back_capacity // __n <= __back_capacity
for (iterator __i = __base::end(); __f != __l; ++__i, ++__f, ++__base::size()) for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f); __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
} }

View File

@ -991,7 +991,7 @@ forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l)
iterator __i = before_begin(); iterator __i = before_begin();
iterator __j = _VSTD::next(__i); iterator __j = _VSTD::next(__i);
iterator __e = end(); iterator __e = end();
for (; __j != __e && __f != __l; ++__i, ++__j, ++__f) for (; __j != __e && __f != __l; ++__i, (void) ++__j, ++__f)
*__j = *__f; *__j = *__f;
if (__j == __e) if (__j == __e)
insert_after(__i, __f, __l); insert_after(__i, __f, __l);
@ -1201,7 +1201,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
try try
{ {
#endif // _LIBCPP_NO_EXCEPTIONS #endif // _LIBCPP_NO_EXCEPTIONS
for (++__f; __f != __l; ++__f, __last = __last->__next_) for (++__f; __f != __l; ++__f, ((void)(__last = __last->__next_)))
{ {
__h.reset(__node_traits::allocate(__a, 1)); __h.reset(__node_traits::allocate(__a, 1));
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f);

View File

@ -456,7 +456,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
size_t __n_does_match = 0; // but none of them definitely do size_t __n_does_match = 0; // but none of them definitely do
// Initialize all statuses to __might_match, except for "" keywords are __does_match // Initialize all statuses to __might_match, except for "" keywords are __does_match
unsigned char* __st = __status; unsigned char* __st = __status;
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{ {
if (!__ky->empty()) if (!__ky->empty())
*__st = __might_match; *__st = __might_match;
@ -482,7 +482,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
// If the keyword doesn't match this character, then change the keyword // If the keyword doesn't match this character, then change the keyword
// to doesn't match // to doesn't match
__st = __status; __st = __status;
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{ {
if (*__st == __might_match) if (*__st == __might_match)
{ {
@ -516,7 +516,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
if (__n_might_match + __n_does_match > 1) if (__n_might_match + __n_does_match > 1)
{ {
__st = __status; __st = __status;
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
{ {
if (*__st == __does_match && __ky->size() != __indx+1) if (*__st == __does_match && __ky->size() != __indx+1)
{ {
@ -531,7 +531,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
if (__b == __e) if (__b == __e)
__err |= ios_base::eofbit; __err |= ios_base::eofbit;
// Return the first matching result // Return the first matching result
for (__st = __status; __kb != __ke; ++__kb, ++__st) for (__st = __status; __kb != __ke; ++__kb, (void) ++__st)
if (*__st == __does_match) if (*__st == __does_match)
break; break;
if (__kb == __ke) if (__kb == __ke)
@ -1857,7 +1857,7 @@ __get_up_to_n_digits(_InputIterator& __b, _InputIterator __e,
return 0; return 0;
} }
int __r = __ct.narrow(__c, 0) - '0'; int __r = __ct.narrow(__c, 0) - '0';
for (++__b, --__n; __b != __e && __n > 0; ++__b, --__n) for (++__b, (void) --__n; __b != __e && __n > 0; ++__b, (void) --__n)
{ {
// get next digit // get next digit
__c = *__b; __c = *__b;

View File

@ -91,7 +91,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_Tp _Tp
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
{ {
for (; __first1 != __last1; ++__first1, ++__first2) for (; __first1 != __last1; ++__first1, (void) ++__first2)
__init = __init + *__first1 * *__first2; __init = __init + *__first1 * *__first2;
return __init; return __init;
} }
@ -102,7 +102,7 @@ _Tp
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
_Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
{ {
for (; __first1 != __last1; ++__first1, ++__first2) for (; __first1 != __last1; ++__first1, (void) ++__first2)
__init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
return __init; return __init;
} }
@ -116,7 +116,7 @@ partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __res
{ {
typename iterator_traits<_InputIterator>::value_type __t(*__first); typename iterator_traits<_InputIterator>::value_type __t(*__first);
*__result = __t; *__result = __t;
for (++__first, ++__result; __first != __last; ++__first, ++__result) for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{ {
__t = __t + *__first; __t = __t + *__first;
*__result = __t; *__result = __t;
@ -135,7 +135,7 @@ partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __res
{ {
typename iterator_traits<_InputIterator>::value_type __t(*__first); typename iterator_traits<_InputIterator>::value_type __t(*__first);
*__result = __t; *__result = __t;
for (++__first, ++__result; __first != __last; ++__first, ++__result) for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{ {
__t = __binary_op(__t, *__first); __t = __binary_op(__t, *__first);
*__result = __t; *__result = __t;
@ -153,7 +153,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
{ {
typename iterator_traits<_InputIterator>::value_type __t1(*__first); typename iterator_traits<_InputIterator>::value_type __t1(*__first);
*__result = __t1; *__result = __t1;
for (++__first, ++__result; __first != __last; ++__first, ++__result) for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{ {
typename iterator_traits<_InputIterator>::value_type __t2(*__first); typename iterator_traits<_InputIterator>::value_type __t2(*__first);
*__result = __t2 - __t1; *__result = __t2 - __t1;
@ -173,7 +173,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
{ {
typename iterator_traits<_InputIterator>::value_type __t1(*__first); typename iterator_traits<_InputIterator>::value_type __t1(*__first);
*__result = __t1; *__result = __t1;
for (++__first, ++__result; __first != __last; ++__first, ++__result) for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
{ {
typename iterator_traits<_InputIterator>::value_type __t2(*__first); typename iterator_traits<_InputIterator>::value_type __t2(*__first);
*__result = __binary_op(__t2, __t1); *__result = __binary_op(__t2, __t1);
@ -188,7 +188,7 @@ inline _LIBCPP_INLINE_VISIBILITY
void void
iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_) iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
{ {
for (; __first != __last; ++__first, ++__value_) for (; __first != __last; ++__first, (void) ++__value_)
*__first = __value_; *__first = __value_;
} }

View File

@ -2215,7 +2215,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _For
__set_long_cap(__cap+1); __set_long_cap(__cap+1);
__set_long_size(__sz); __set_long_size(__sz);
} }
for (; __first != __last; ++__first, ++__p) for (; __first != __last; ++__first, (void) ++__p)
traits_type::assign(*__p, *__first); traits_type::assign(*__p, *__first);
traits_type::assign(*__p, value_type()); traits_type::assign(*__p, value_type());
} }

View File

@ -207,7 +207,7 @@ inline _LIBCPP_INLINE_VISIBILITY
_ForwardIterator2 _ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)
{ {
for(; __first1 != __last1; ++__first1, ++__first2) for(; __first1 != __last1; ++__first1, (void) ++__first2)
swap(*__first1, *__first2); swap(*__first1, *__first2);
return __first2; return __first2;
} }

View File

@ -70,7 +70,7 @@ int main()
typedef input_iterator<const T*> I; typedef input_iterator<const T*> I;
c.assign(I(std::begin(t0)), I(std::end(t0))); c.assign(I(std::begin(t0)), I(std::end(t0)));
int n = 0; int n = 0;
for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, ++n) for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, (void) ++n)
assert(*i == 10+n); assert(*i == 10+n);
assert(n == 4); assert(n == 4);
} }

View File

@ -38,6 +38,9 @@ public:
output_iterator& operator++() {++it_; return *this;} output_iterator& operator++() {++it_; return *this;}
output_iterator operator++(int) output_iterator operator++(int)
{output_iterator tmp(*this); ++(*this); return tmp;} {output_iterator tmp(*this); ++(*this); return tmp;}
template <class T>
void operator,(T const &);
}; };
template <class It> template <class It>
@ -71,6 +74,9 @@ public:
{return x.it_ == y.it_;} {return x.it_ == y.it_;}
friend bool operator!=(const input_iterator& x, const input_iterator& y) friend bool operator!=(const input_iterator& x, const input_iterator& y)
{return !(x == y);} {return !(x == y);}
template <class T>
void operator,(T const &);
}; };
template <class T, class U> template <class T, class U>
@ -120,6 +126,9 @@ public:
{return x.it_ == y.it_;} {return x.it_ == y.it_;}
friend bool operator!=(const forward_iterator& x, const forward_iterator& y) friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
{return !(x == y);} {return !(x == y);}
template <class T>
void operator,(T const &);
}; };
template <class T, class U> template <class T, class U>
@ -168,6 +177,9 @@ public:
bidirectional_iterator& operator--() {--it_; return *this;} bidirectional_iterator& operator--() {--it_; return *this;}
bidirectional_iterator operator--(int) bidirectional_iterator operator--(int)
{bidirectional_iterator tmp(*this); --(*this); return tmp;} {bidirectional_iterator tmp(*this); --(*this); return tmp;}
template <class T>
void operator,(T const &);
}; };
template <class T, class U> template <class T, class U>
@ -227,6 +239,9 @@ public:
{random_access_iterator tmp(*this); tmp -= n; return tmp;} {random_access_iterator tmp(*this); tmp -= n; return tmp;}
reference operator[](difference_type n) const {return it_[n];} reference operator[](difference_type n) const {return it_[n];}
template <class T>
void operator,(T const &);
}; };
template <class T, class U> template <class T, class U>