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: unassig...@gcc.gnu.org
        ReportedBy: thi...@kde.org


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)

Reply via email to