https://gcc.gnu.org/g:9c75032b40003bf0d3776aabdfc618ecb88c3a8a
commit r16-2229-g9c75032b40003bf0d3776aabdfc618ecb88c3a8a Author: Jonathan Wakely <jwak...@redhat.com> Date: Sun Jul 13 09:33:04 2025 +0100 libstdc++: Protect PSTL headers against overloaded commas Reported upstream: https://github.com/uxlfoundation/oneDPL/issues/2342 libstdc++-v3/ChangeLog: * include/pstl/algorithm_impl.h (__for_each_n_it_serial): Protect against overloaded comma operator. (__brick_walk2): Likewise. (__brick_walk2_n): Likewise. (__brick_walk3): Likewise. (__brick_move_destroy::operator()): Likewise. (__brick_calc_mask_1): Likewise. (__brick_copy_by_mask): Likewise. (__brick_partition_by_mask): Likewise. (__brick_calc_mask_2): Likewise. (__brick_reverse): Likewise. (__pattern_partial_sort_copy): Likewise. * include/pstl/memory_impl.h (__brick_uninitialized_move): Likewise. (__brick_uninitialized_copy): Likewise. * include/pstl/numeric_impl.h (__brick_transform_scan): Likewise. Diff: --- libstdc++-v3/include/pstl/algorithm_impl.h | 24 ++++++++++++------------ libstdc++-v3/include/pstl/memory_impl.h | 4 ++-- libstdc++-v3/include/pstl/numeric_impl.h | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libstdc++-v3/include/pstl/algorithm_impl.h b/libstdc++-v3/include/pstl/algorithm_impl.h index 5b1cd2010944..2080e82f8b49 100644 --- a/libstdc++-v3/include/pstl/algorithm_impl.h +++ b/libstdc++-v3/include/pstl/algorithm_impl.h @@ -79,7 +79,7 @@ template <class _ForwardIterator, class _Size, class _Function> _ForwardIterator __for_each_n_it_serial(_ForwardIterator __first, _Size __n, _Function __f) { - for (; __n > 0; ++__first, --__n) + for (; __n > 0; ++__first, (void) --__n) __f(__first); return __first; } @@ -221,7 +221,7 @@ _ForwardIterator2 __brick_walk2(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _Function __f, /*vector=*/std::false_type) noexcept { - for (; __first1 != __last1; ++__first1, ++__first2) + for (; __first1 != __last1; ++__first1, (void) ++__first2) __f(*__first1, *__first2); return __first2; } @@ -240,7 +240,7 @@ _ForwardIterator2 __brick_walk2_n(_ForwardIterator1 __first1, _Size __n, _ForwardIterator2 __first2, _Function __f, /*vector=*/std::false_type) noexcept { - for (; __n > 0; --__n, ++__first1, ++__first2) + for (; __n > 0; --__n, (void) ++__first1, ++__first2) __f(*__first1, *__first2); return __first2; } @@ -364,7 +364,7 @@ _ForwardIterator3 __brick_walk3(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator3 __first3, _Function __f, /*vector=*/std::false_type) noexcept { - for (; __first1 != __last1; ++__first1, ++__first2, ++__first3) + for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__first3) __f(*__first1, *__first2, *__first3); return __first3; } @@ -961,7 +961,7 @@ struct __brick_move_destroy { using _IteratorValueType = typename std::iterator_traits<_RandomAccessIterator1>::value_type; - for (; __first != __last; ++__first, ++__result) + for (; __first != __last; ++__first, (void) ++__result) { *__result = std::move(*__first); (*__first).~_IteratorValueType(); @@ -1027,7 +1027,7 @@ __brick_calc_mask_1(_ForwardIterator __first, _ForwardIterator __last, bool* __r static_assert(__are_random_access_iterators<_ForwardIterator>::value, "Pattern-brick error. Should be a random access iterator."); - for (; __first != __last; ++__first, ++__mask) + for (; __first != __last; ++__first, (void) ++__mask) { *__mask = __pred(*__first); if (*__mask) @@ -1052,7 +1052,7 @@ void __brick_copy_by_mask(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, bool* __mask, _Assigner __assigner, /*vector=*/std::false_type) noexcept { - for (; __first != __last; ++__first, ++__mask) + for (; __first != __last; ++__first, (void) ++__mask) { if (*__mask) { @@ -1079,7 +1079,7 @@ void __brick_partition_by_mask(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator1 __out_true, _OutputIterator2 __out_false, bool* __mask, /*vector=*/std::false_type) noexcept { - for (; __first != __last; ++__first, ++__mask) + for (; __first != __last; ++__first, (void) ++__mask) { if (*__mask) { @@ -1383,7 +1383,7 @@ __brick_calc_mask_2(_RandomAccessIterator __first, _RandomAccessIterator __last, _BinaryPredicate __pred, /*vector=*/std::false_type) noexcept { _DifferenceType __count = 0; - for (; __first != __last; ++__first, ++__mask) + for (; __first != __last; ++__first, (void) ++__mask) { *__mask = !__pred(*__first, *(__first - 1)); __count += *__mask; @@ -1483,7 +1483,7 @@ void __brick_reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, _BidirectionalIterator __d_last, /*is_vector=*/std::false_type) noexcept { - for (--__d_last; __first != __last; ++__first, --__d_last) + for (--__d_last; __first != __last; ++__first, (void) --__d_last) { using std::iter_swap; iter_swap(__first, __d_last); @@ -2333,7 +2333,7 @@ __pattern_partial_sort_copy(__parallel_tag<_IsVector> __tag, _ExecutionPolicy&& _RandomAccessIterator1 __it = __first + (__i - __r); // 1. Copy elements from input to raw memory - for (_T1* __k = __i; __k != __j; ++__k, ++__it) + for (_T1* __k = __i; __k != __j; ++__k, (void) ++__it) { ::new (__k) _T2(*__it); } @@ -3648,7 +3648,7 @@ __mismatch_serial(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _Forwar #if defined(_PSTL_CPP14_2RANGE_MISMATCH_EQUAL_PRESENT) return std::mismatch(__first1, __last1, __first2, __last2, __pred); #else - for (; __first1 != __last1 && __first2 != __last2 && __pred(*__first1, *__first2); ++__first1, ++__first2) + for (; __first1 != __last1 && __first2 != __last2 && __pred(*__first1, *__first2); ++__first1, (void) ++__first2) { } return std::make_pair(__first1, __first2); diff --git a/libstdc++-v3/include/pstl/memory_impl.h b/libstdc++-v3/include/pstl/memory_impl.h index 8cb32d043e5e..080b6cada5bf 100644 --- a/libstdc++-v3/include/pstl/memory_impl.h +++ b/libstdc++-v3/include/pstl/memory_impl.h @@ -29,7 +29,7 @@ __brick_uninitialized_move(_ForwardIterator __first, _ForwardIterator __last, _O /*vector=*/std::false_type) noexcept { using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type; - for (; __first != __last; ++__first, ++__result) + for (; __first != __last; ++__first, (void) ++__result) { ::new (std::addressof(*__result)) _ValueType(std::move(*__first)); } @@ -80,7 +80,7 @@ __brick_uninitialized_copy(_ForwardIterator __first, _ForwardIterator __last, _O /*vector=*/std::false_type) noexcept { using _ValueType = typename std::iterator_traits<_OutputIterator>::value_type; - for (; __first != __last; ++__first, ++__result) + for (; __first != __last; ++__first, (void) ++__result) { ::new (std::addressof(*__result)) _ValueType(*__first); } diff --git a/libstdc++-v3/include/pstl/numeric_impl.h b/libstdc++-v3/include/pstl/numeric_impl.h index b285a667653a..af6f6a2c8d57 100644 --- a/libstdc++-v3/include/pstl/numeric_impl.h +++ b/libstdc++-v3/include/pstl/numeric_impl.h @@ -158,7 +158,7 @@ __brick_transform_scan(_ForwardIterator __first, _ForwardIterator __last, _Outpu _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, /*Inclusive*/ std::false_type, /*is_vector=*/std::false_type) noexcept { - for (; __first != __last; ++__first, ++__result) + for (; __first != __last; ++__first, (void) ++__result) { _Tp __v = std::move(__init); _PSTL_PRAGMA_FORCEINLINE @@ -175,7 +175,7 @@ __brick_transform_scan(_RandomAccessIterator __first, _RandomAccessIterator __la _UnaryOperation __unary_op, _Tp __init, _BinaryOperation __binary_op, /*Inclusive*/ std::true_type, /*is_vector=*/std::false_type) noexcept { - for (; __first != __last; ++__first, ++__result) + for (; __first != __last; ++__first, (void) ++__result) { _PSTL_PRAGMA_FORCEINLINE __init = __binary_op(__init, __unary_op(*__first));