Skip to content

Commit 910285b

Browse files
committedOct 27, 2014
[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 llvm-svn: 220706
1 parent f289628 commit 910285b

File tree

9 files changed

+51
-36
lines changed

9 files changed

+51
-36
lines changed
 

‎libcxx/include/algorithm

+16-16
Original file line numberDiff line numberDiff line change
@@ -1189,7 +1189,7 @@ inline _LIBCPP_INLINE_VISIBILITY
11891189
bool
11901190
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
11911191
{
1192-
for (; __first1 != __last1; ++__first1, ++__first2)
1192+
for (; __first1 != __last1; ++__first1, (void) ++__first2)
11931193
if (!__pred(*__first1, *__first2))
11941194
return false;
11951195
return true;
@@ -1213,7 +1213,7 @@ __equal(_InputIterator1 __first1, _InputIterator1 __last1,
12131213
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
12141214
input_iterator_tag, input_iterator_tag )
12151215
{
1216-
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
1216+
for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void) ++__first2)
12171217
if (!__pred(*__first1, *__first2))
12181218
return false;
12191219
return __first1 == __last1 && __first2 == __last2;
@@ -1267,7 +1267,7 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
12671267
_ForwardIterator2 __first2, _BinaryPredicate __pred)
12681268
{
12691269
// shorten sequences as much as possible by lopping of any equal parts
1270-
for (; __first1 != __last1; ++__first1, ++__first2)
1270+
for (; __first1 != __last1; ++__first1, (void) ++__first2)
12711271
if (!__pred(*__first1, *__first2))
12721272
goto __not_done;
12731273
return true;
@@ -1745,7 +1745,7 @@ inline _LIBCPP_INLINE_VISIBILITY
17451745
_OutputIterator
17461746
__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
17471747
{
1748-
for (; __first != __last; ++__first, ++__result)
1748+
for (; __first != __last; ++__first, (void) ++__result)
17491749
*__result = *__first;
17501750
return __result;
17511751
}
@@ -1874,7 +1874,7 @@ inline _LIBCPP_INLINE_VISIBILITY
18741874
_OutputIterator
18751875
__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
18761876
{
1877-
for (; __first != __last; ++__first, ++__result)
1877+
for (; __first != __last; ++__first, (void) ++__result)
18781878
*__result = _VSTD::move(*__first);
18791879
return __result;
18801880
}
@@ -1950,7 +1950,7 @@ inline _LIBCPP_INLINE_VISIBILITY
19501950
_OutputIterator
19511951
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
19521952
{
1953-
for (; __first != __last; ++__first, ++__result)
1953+
for (; __first != __last; ++__first, (void) ++__result)
19541954
*__result = __op(*__first);
19551955
return __result;
19561956
}
@@ -1961,7 +1961,7 @@ _OutputIterator
19611961
transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
19621962
_OutputIterator __result, _BinaryOperation __binary_op)
19631963
{
1964-
for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1964+
for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result)
19651965
*__result = __binary_op(*__first1, *__first2);
19661966
return __result;
19671967
}
@@ -1998,7 +1998,7 @@ _OutputIterator
19981998
replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
19991999
const _Tp& __old_value, const _Tp& __new_value)
20002000
{
2001-
for (; __first != __last; ++__first, ++__result)
2001+
for (; __first != __last; ++__first, (void) ++__result)
20022002
if (*__first == __old_value)
20032003
*__result = __new_value;
20042004
else
@@ -2014,7 +2014,7 @@ _OutputIterator
20142014
replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
20152015
_Predicate __pred, const _Tp& __new_value)
20162016
{
2017-
for (; __first != __last; ++__first, ++__result)
2017+
for (; __first != __last; ++__first, (void) ++__result)
20182018
if (__pred(*__first))
20192019
*__result = __new_value;
20202020
else
@@ -2029,7 +2029,7 @@ inline _LIBCPP_INLINE_VISIBILITY
20292029
_OutputIterator
20302030
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
20312031
{
2032-
for (; __n > 0; ++__first, --__n)
2032+
for (; __n > 0; ++__first, (void) --__n)
20332033
*__first = __value_;
20342034
return __first;
20352035
}
@@ -2103,7 +2103,7 @@ inline _LIBCPP_INLINE_VISIBILITY
21032103
_OutputIterator
21042104
generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
21052105
{
2106-
for (; __n > 0; ++__first, --__n)
2106+
for (; __n > 0; ++__first, (void) --__n)
21072107
*__first = __gen();
21082108
return __first;
21092109
}
@@ -4372,7 +4372,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
43724372
if (__len1 <= __len2)
43734373
{
43744374
value_type* __p = __buff;
4375-
for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
4375+
for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
43764376
::new(__p) value_type(_VSTD::move(*__i));
43774377
__merge<_Compare>(move_iterator<value_type*>(__buff),
43784378
move_iterator<value_type*>(__p),
@@ -4383,7 +4383,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
43834383
else
43844384
{
43854385
value_type* __p = __buff;
4386-
for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
4386+
for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
43874387
::new(__p) value_type(_VSTD::move(*__i));
43884388
typedef reverse_iterator<_BidirectionalIterator> _RBi;
43894389
typedef reverse_iterator<value_type*> _Rv;
@@ -4408,7 +4408,7 @@ __inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle,
44084408
if (__len2 == 0)
44094409
return;
44104410
// shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4411-
for (; true; ++__first, --__len1)
4411+
for (; true; ++__first, (void) --__len1)
44124412
{
44134413
if (__len1 == 0)
44144414
return;
@@ -5067,7 +5067,7 @@ __partial_sort_copy(_InputIterator __first, _InputIterator __last,
50675067
_RandomAccessIterator __r = __result_first;
50685068
if (__r != __result_last)
50695069
{
5070-
for (; __first != __last && __r != __result_last; ++__first, ++__r)
5070+
for (; __first != __last && __r != __result_last; (void) ++__first, ++__r)
50715071
*__r = *__first;
50725072
__make_heap<_Compare>(__result_first, __r, __comp);
50735073
typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first;
@@ -5589,7 +5589,7 @@ bool
55895589
__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
55905590
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
55915591
{
5592-
for (; __first2 != __last2; ++__first1, ++__first2)
5592+
for (; __first2 != __last2; ++__first1, (void) ++__first2)
55935593
{
55945594
if (__first1 == __last1 || __comp(*__first1, *__first2))
55955595
return true;

‎libcxx/include/deque

+3-3
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,7 @@ deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l,
15881588
{
15891589
iterator __i = __base::begin();
15901590
iterator __e = __base::end();
1591-
for (; __f != __l && __i != __e; ++__f, ++__i)
1591+
for (; __f != __l && __i != __e; ++__f, (void) ++__i)
15921592
*__i = *__f;
15931593
if (__f != __l)
15941594
__append(__f, __l);
@@ -2160,7 +2160,7 @@ deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l,
21602160
if (__n > __de)
21612161
{
21622162
__m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de);
2163-
for (_BiIter __j = __m; __j != __l; ++__i, ++__j, ++__base::size())
2163+
for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size())
21642164
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j);
21652165
__n = __de;
21662166
}
@@ -2200,7 +2200,7 @@ deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l,
22002200
if (__n > __back_capacity)
22012201
__add_back_capacity(__n - __back_capacity);
22022202
// __n <= __back_capacity
2203-
for (iterator __i = __base::end(); __f != __l; ++__i, ++__f, ++__base::size())
2203+
for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size())
22042204
__alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f);
22052205
}
22062206

‎libcxx/include/forward_list

+2-2
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l)
991991
iterator __i = before_begin();
992992
iterator __j = _VSTD::next(__i);
993993
iterator __e = end();
994-
for (; __j != __e && __f != __l; ++__i, ++__j, ++__f)
994+
for (; __j != __e && __f != __l; ++__i, (void) ++__j, ++__f)
995995
*__j = *__f;
996996
if (__j == __e)
997997
insert_after(__i, __f, __l);
@@ -1201,7 +1201,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
12011201
try
12021202
{
12031203
#endif // _LIBCPP_NO_EXCEPTIONS
1204-
for (++__f; __f != __l; ++__f, __last = __last->__next_)
1204+
for (++__f; __f != __l; ++__f, ((void)(__last = __last->__next_)))
12051205
{
12061206
__h.reset(__node_traits::allocate(__a, 1));
12071207
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f);

‎libcxx/include/locale

+5-5
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
456456
size_t __n_does_match = 0; // but none of them definitely do
457457
// Initialize all statuses to __might_match, except for "" keywords are __does_match
458458
unsigned char* __st = __status;
459-
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
459+
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
460460
{
461461
if (!__ky->empty())
462462
*__st = __might_match;
@@ -482,7 +482,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
482482
// If the keyword doesn't match this character, then change the keyword
483483
// to doesn't match
484484
__st = __status;
485-
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
485+
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
486486
{
487487
if (*__st == __might_match)
488488
{
@@ -516,7 +516,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
516516
if (__n_might_match + __n_does_match > 1)
517517
{
518518
__st = __status;
519-
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st)
519+
for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, (void) ++__st)
520520
{
521521
if (*__st == __does_match && __ky->size() != __indx+1)
522522
{
@@ -531,7 +531,7 @@ __scan_keyword(_InputIterator& __b, _InputIterator __e,
531531
if (__b == __e)
532532
__err |= ios_base::eofbit;
533533
// Return the first matching result
534-
for (__st = __status; __kb != __ke; ++__kb, ++__st)
534+
for (__st = __status; __kb != __ke; ++__kb, (void) ++__st)
535535
if (*__st == __does_match)
536536
break;
537537
if (__kb == __ke)
@@ -1857,7 +1857,7 @@ __get_up_to_n_digits(_InputIterator& __b, _InputIterator __e,
18571857
return 0;
18581858
}
18591859
int __r = __ct.narrow(__c, 0) - '0';
1860-
for (++__b, --__n; __b != __e && __n > 0; ++__b, --__n)
1860+
for (++__b, (void) --__n; __b != __e && __n > 0; ++__b, (void) --__n)
18611861
{
18621862
// get next digit
18631863
__c = *__b;

‎libcxx/include/numeric

+7-7
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ inline _LIBCPP_INLINE_VISIBILITY
9191
_Tp
9292
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
9393
{
94-
for (; __first1 != __last1; ++__first1, ++__first2)
94+
for (; __first1 != __last1; ++__first1, (void) ++__first2)
9595
__init = __init + *__first1 * *__first2;
9696
return __init;
9797
}
@@ -102,7 +102,7 @@ _Tp
102102
inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
103103
_Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
104104
{
105-
for (; __first1 != __last1; ++__first1, ++__first2)
105+
for (; __first1 != __last1; ++__first1, (void) ++__first2)
106106
__init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
107107
return __init;
108108
}
@@ -116,7 +116,7 @@ partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __res
116116
{
117117
typename iterator_traits<_InputIterator>::value_type __t(*__first);
118118
*__result = __t;
119-
for (++__first, ++__result; __first != __last; ++__first, ++__result)
119+
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
120120
{
121121
__t = __t + *__first;
122122
*__result = __t;
@@ -135,7 +135,7 @@ partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __res
135135
{
136136
typename iterator_traits<_InputIterator>::value_type __t(*__first);
137137
*__result = __t;
138-
for (++__first, ++__result; __first != __last; ++__first, ++__result)
138+
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
139139
{
140140
__t = __binary_op(__t, *__first);
141141
*__result = __t;
@@ -153,7 +153,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
153153
{
154154
typename iterator_traits<_InputIterator>::value_type __t1(*__first);
155155
*__result = __t1;
156-
for (++__first, ++__result; __first != __last; ++__first, ++__result)
156+
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
157157
{
158158
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
159159
*__result = __t2 - __t1;
@@ -173,7 +173,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
173173
{
174174
typename iterator_traits<_InputIterator>::value_type __t1(*__first);
175175
*__result = __t1;
176-
for (++__first, ++__result; __first != __last; ++__first, ++__result)
176+
for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
177177
{
178178
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
179179
*__result = __binary_op(__t2, __t1);
@@ -188,7 +188,7 @@ inline _LIBCPP_INLINE_VISIBILITY
188188
void
189189
iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
190190
{
191-
for (; __first != __last; ++__first, ++__value_)
191+
for (; __first != __last; ++__first, (void) ++__value_)
192192
*__first = __value_;
193193
}
194194

‎libcxx/include/string

+1-1
Original file line numberDiff line numberDiff line change
@@ -2215,7 +2215,7 @@ basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _For
22152215
__set_long_cap(__cap+1);
22162216
__set_long_size(__sz);
22172217
}
2218-
for (; __first != __last; ++__first, ++__p)
2218+
for (; __first != __last; ++__first, (void) ++__p)
22192219
traits_type::assign(*__p, *__first);
22202220
traits_type::assign(*__p, value_type());
22212221
}

‎libcxx/include/utility

+1-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ inline _LIBCPP_INLINE_VISIBILITY
207207
_ForwardIterator2
208208
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)
209209
{
210-
for(; __first1 != __last1; ++__first1, ++__first2)
210+
for(; __first1 != __last1; ++__first1, (void) ++__first2)
211211
swap(*__first1, *__first2);
212212
return __first2;
213213
}

‎libcxx/test/containers/sequences/forwardlist/forwardlist.cons/assign_range.pass.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ int main()
7070
typedef input_iterator<const T*> I;
7171
c.assign(I(std::begin(t0)), I(std::end(t0)));
7272
int n = 0;
73-
for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, ++n)
73+
for (C::const_iterator i = c.cbegin(); i != c.cend(); ++i, (void) ++n)
7474
assert(*i == 10+n);
7575
assert(n == 4);
7676
}

‎libcxx/test/support/test_iterators.h

+15
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class output_iterator
3838
output_iterator& operator++() {++it_; return *this;}
3939
output_iterator operator++(int)
4040
{output_iterator tmp(*this); ++(*this); return tmp;}
41+
42+
template <class T>
43+
void operator,(T const &);
4144
};
4245

4346
template <class It>
@@ -71,6 +74,9 @@ class input_iterator
7174
{return x.it_ == y.it_;}
7275
friend bool operator!=(const input_iterator& x, const input_iterator& y)
7376
{return !(x == y);}
77+
78+
template <class T>
79+
void operator,(T const &);
7480
};
7581

7682
template <class T, class U>
@@ -120,6 +126,9 @@ class forward_iterator
120126
{return x.it_ == y.it_;}
121127
friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
122128
{return !(x == y);}
129+
130+
template <class T>
131+
void operator,(T const &);
123132
};
124133

125134
template <class T, class U>
@@ -168,6 +177,9 @@ class bidirectional_iterator
168177
bidirectional_iterator& operator--() {--it_; return *this;}
169178
bidirectional_iterator operator--(int)
170179
{bidirectional_iterator tmp(*this); --(*this); return tmp;}
180+
181+
template <class T>
182+
void operator,(T const &);
171183
};
172184

173185
template <class T, class U>
@@ -227,6 +239,9 @@ class random_access_iterator
227239
{random_access_iterator tmp(*this); tmp -= n; return tmp;}
228240

229241
reference operator[](difference_type n) const {return it_[n];}
242+
243+
template <class T>
244+
void operator,(T const &);
230245
};
231246

232247
template <class T, class U>

0 commit comments

Comments
 (0)
Please sign in to comment.