[Bug c++/67550] New: Initialization of local struct array with elements of global array yields zeros instead of initializer values
f.knauf at mmkf dot de
gcc-bugzilla@gcc.gnu.org
Fri Sep 11 14:08:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67550
Bug ID: 67550
Summary: Initialization of local struct array with elements of
global array yields zeros instead of initializer
values
Product: gcc
Version: 5.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: f.knauf at mmkf dot de
Target Milestone: ---
Initializing a function-local struct array from values in a global struct array
yields wrong values with gcc 5.2.1. The problem can be reproduced with the
following code:
#include <iostream>
#include <limits>
struct S {
int x;
int y;
};
S const data[] = {
{ 1, std::numeric_limits<int>::max() }
};
int main() {
S data2[] = {
data[0]
};
std::cout
<< data [0].x << ", " << data [0].y << "\n"
<< data2[0].x << ", " << data2[0].y << "\n"
;
}
The output is:
$ g++ -Wall -Wextra -pedantic foo.cc
$ ./a.out
1, 2147483647
1, 0
The expected output was:
1, 2147483647
1, 2147483647
I am using gcc 5.2.1 on Debian sid (Linux 4.1.3) for x86-64. The error is also
reproducible with gcc 5.2.0 on Arch Linux (also x86-64) and gcc 5.1.1 on Fedora
22 (also x86-64). It is not reproducible with gcc 4.9.3.
A workaround for the error is to remove the "const" keyword from the
declaration of "data", i.e.
S data[] = {
{ 1, std::numeric_limits<int>::max() }
};
The error also does not appear if std::numeric_limits<int>::max() is replaced
with a compile-time constant value (such as 42). Consequently, in C++11 mode
(where std::numeric_limits<int>::max() is constexpr) the above code does not
reproduce the error. Instead,
int foo() { return 23; }
S const data[] = {
{ 1, foo() }
};
can be used to produce the wrong result. With
int constexpr foo() { return 23; }
the correct result is produced.
More information about the Gcc-bugs
mailing list