[Bug c++/84262] New: Header file initialization of a static constant causes linker error if code is compiled without optimization
Serguei.Kolos at cern dot ch
gcc-bugzilla@gcc.gnu.org
Wed Feb 7 11:20:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84262
Bug ID: 84262
Summary: Header file initialization of a static constant causes
linker error if code is compiled without optimization
Product: gcc
Version: 6.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Serguei.Kolos at cern dot ch
Target Milestone: ---
I have noticed that my project, which is compiled and linked without errors
using -O2 flag, fails to be linked in 'debug' mode. Below is the minimal code,
which reproduces the problem.
// BEGIN SAMPLE
#include <vector>
struct D {
D(unsigned int , unsigned int , unsigned int ) { ; }
};
struct M
{
static const unsigned int c1 = 1;
static const unsigned int c2 = 2;
static const unsigned int c3 = 3;
M()
{
m_data.reserve(1);
m_data.emplace_back(c1, c2, c3);
}
std::vector<D> m_data;
};
int main(int ac, char** av) {
M m;
}
// END SAMPLE
The code compiles just fine with any level of optimization above zero, e.g.:
> g++ -O1 bug.cc
while removing '-O' flag results in linker error, like:
> g++ bug.cc
/tmp/user/ccxT4JuS.o: In function `M::M()':
bug.cc:(.text._ZN1MC2Ev[_ZN1MC5Ev]+0x2f): undefined reference to `M::c3'
bug.cc:(.text._ZN1MC2Ev[_ZN1MC5Ev]+0x34): undefined reference to `M::c2'
bug.cc:(.text._ZN1MC2Ev[_ZN1MC5Ev]+0x39): undefined reference to `M::c1'
collect2: error: ld returned 1 exit status
According to the article 9.4.2/4 of the C++ standard the code is probably
missing definitions of the c1, c2 and c3 constants:
"If a static data member is of const integral or const enumeration type, its
declaration in the class definition can specify a constant initializer which
shall be an integral constant expression (5.19). In that case, the member can
appear in integral constant expressions within its scope. The member shall
still be defined in a namespace scope if it is used in the program and the
namespace scope definition shall not contain an initializer."
But what bothers me is the fact that the same (seemingly bogus) code compiles
fine with -OX flag. Is that normal?
More information about the Gcc-bugs
mailing list