[Bug libstdc++/69553] New: Optimizations O1/O2 makes std::array value incorrect when passed to function
gee at ptilouk dot net
gcc-bugzilla@gcc.gnu.org
Fri Jan 29 13:45:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69553
Bug ID: 69553
Summary: Optimizations O1/O2 makes std::array value incorrect
when passed to function
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: gee at ptilouk dot net
Target Milestone: ---
Created attachment 37521
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37521&action=edit
Source code generating the bug
The following example displays incorrect values when compiling with
optimizations -O1 or -O2 (but not without optimization and not with -O3):
----------------------
#include <iostream>
#include <array>
typedef std::array<std::array<double, 2>, 2> Matrix;
void foo(const double &px, const double &py)
{
std::cerr << px << " " << py << std::endl;
}
std::ostream& operator<<(std::ostream& os, const std::array<double, 2>& p)
{
return os << p[0] << " " << p[1];
}
void test (const Matrix& t)
{
std::cerr << "In test: " << std::endl
<< t[0] << std::endl
<< t[1] << std::endl;
std::cerr << "In foo: " << std::endl;
foo(t[0][0], t[0][1]);
foo(t[1][0], t[1][1]);
}
int main (int, char**)
{
Matrix t = {{ {{1,2}}, {{3,4}} }};
test (t);
return 0;
}
----------------------
(Compiled with 'g++-6 -std=c++11 -O1 test_bug_array.cpp')
Without optimization (or with O3), i have the following output:
In test:
1 2
3 4
In foo:
1 2
3 4
Which makes sense. Now if I turn on O1 or O2, I get:
In test:
1 2
3 4
In foo:
1 3
3 4
The bug does not appear when using boost::array or when replacing the structure
by a simple C-array (double[2][2]) or by pairs (std::pair<std::pair<double> >).
More information about the Gcc-bugs
mailing list