http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49673
Summary: [C++0x] const variables initialised with constexpr
constructor placed in .data not .rodata
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: [email protected]
ReportedBy: [email protected]
This bug is similar but not exactly like bug 4131. That bug is requesting that
regular, unmarked constructors be discovered to be trivial and pre-initialised
into .data or even .rodata. In this case here, we have the C++0x constexpr
marker added to the constructor already.
Given the following source code:
====8<-----
struct Data
{
int i;
};
extern const Data test_data = { 1 };
====8<-----
Compiled with
g++ -O3 -S
produces as expected (trimmed):
====8<-----
.section .rodata
test_data:
.long 1
====8<-----
However, if we add a constexpr constructor and make the code as:
====8<-----
struct Data
{
int i;
constexpr inline Data(int i = 0) : i(i+1) {}
};
extern const Data test_data = { 1 };
====8<-----
The "+1" is added to confirm that the constexpr constructor was evaluated at
compile time. Compiled the same way produces no errors, however, it generates
the code:
====8<-----
.data
test_data:
.long 2
====8<-----
The constructor was evaluated and the result was properly calculated. However,
the result is stored in .data instead of .rodata as expected.
Compiler information:
Target: i586-mandriva-linux-gnu
Configured with: ./configure --build=i586-mandriva-linux-gnu --prefix=/usr
--exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc
--datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib
--libexecdir=/usr/lib --localstatedir=/var --sharedstatedir=/usr/com
--mandir=/usr/share/man --infodir=/usr/share/info --x-includes=/usr/include
--x-libraries=/usr/lib --disable-libjava-multilib
--with-java-home=/usr/lib/jvm/java-rpmbuild
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-java-awt=qt,gtk
--enable-gtk-cairo --with-cloog --with-ppl --enable-cloog-backend=ppl
--disable-libssp --disable-libunwind-exceptions --disable-werror
--enable-__cxa_atexit --enable-bootstrap --enable-checking=release
--enable-gnu-unique-object
--enable-languages=c,ada,c++,fortran,go,java,lto,objc,obj-c++
--enable-linker-build-id --enable-plugin --enable-shared --enable-threads=posix
--with-system-zlib --with-bugurl=https://qa.mandriva.com/ --with-tune=generic
--with-arch=i686 --host=i586-mandriva-linux-gnu
--target=i586-mandriva-linux-gnu
Thread model: posix
gcc version 4.6.1 20110627 (Mandriva) (GCC)