https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121529

            Bug ID: 121529
           Summary: std::valarray fails size assertion when using multiple
                    chained operator+ calls
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: 2023091106 at cauc dot edu.cn
  Target Milestone: ---

Product / Version:

    GCC trunk / 15.0 / 16.0.0


g++ -std=c++20 -O0 test.cpp -o test

GCC 15/16 added length checks for `std::valarray`, but the checks only apply to
two operands at a time, allowing multiple chained operators to bypass the
length check.see as https://godbolt.org/z/3ezEnT3zb

========== code ==========
#include <valarray>
#include <iostream>
using namespace std;

int main() {
    typedef std::valarray<int> A;
    A a(3, 2), b(3, 2), e(1, 3);

    // This line does not trigger assertion failure
    A c = a + b + e;

    // This line triggers assertion failure
    // A c = a + e;

    A d = c;
    printf("Result array size: %zu\n", d.size());

    return 0;
}

========== output ==========
when A c = a + b + e is executed, the program is normal;

When a + e is executed, the program crashes:
/opt/compiler-explorer/gcc-trunk-20250813/include/c++/16.0.0/valarray:1198:
std::_Expr<std::__detail::_BinClos<std::__plus, std::_ValArray, std::_ValArray,
_Tp, _Tp>, typename std::__fun<std::__plus, _Tp>::result_type>
std::operator+(const valarray<_Tp>&, const valarray<_Tp>&) [with _Tp = int;
typename __fun<std::__plus, _Tp>::result_type = int]: Assertion '__v.size() ==
__w.size()' failed.
Program terminated with signal: SIGSEGV

Reply via email to