This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/39112] New: incorrect value of a static const double class member
- From: "alexey dot pushkin at mererand dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 5 Feb 2009 20:26:41 -0000
- Subject: [Bug c++/39112] New: incorrect value of a static const double class member
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
there is a class with a static const double member:
struct Foobar{
static const double var;
};
In one translation unit variable 'var' is defined and initialized as 1.0:
const double Foobar::var = 1.0;
When I access Foobar::var from another translation unit, it's value is 0
instead of 1.0 !
Interestingly, the initialization itself works correctly, if I print bytes
at &Foobar::var, they are
00.00.00.00.00.00.f0.3f, however when dereferencing them with '*' I still
get zero !
This code
const char * ptr = (const char *)(&Foobar::var);
for (int i=0; i < 8; ++i){
if (i) fprintf(stderr, ".");
fprintf(stderr, "%.2x", 0xFF & ptr[i]);
}
fprintf(stderr, " => %g : %g\n", Foobar::var, *((double*)ptr));
produces
00.00.00.00.00.00.f0.3f => 0 : 0
instead of
00.00.00.00.00.00.f0.3f => 1 : 1
Attached is a complete example.
>>THIS BUG SHOWS UP WITH OPTIMIZATION LEVELS OTHER THAN -O0<<
With -O0 it works correctly.
Versions tried:
4.4.0 20090110 (i686-linux)
4.4.0 20090201 (i686-linux)
from Mingw-W64 project site
https://sourceforge.net/project/showfiles.php?group_id=202880&package_id=245516
P.S. Intially I reported this bug to Mingw-W64 people
(https://sourceforge.net/tracker2/?func=detail&atid=983354&aid=2567355&group_id=202880),
however they responded that it's a GCC bug that should
be reported here.
============================================================================
Below is the output from g++ -v:
============================================================================
x86_64-pc-mingw32-g++ -O2 -v -save-temps -c -o main.o main.cpp
Using built-in specs.
Target: x86_64-pc-mingw32
Configured with: ../gcc/configure --target=x86_64-pc-mingw32
--prefix=/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root
--with-sysroot=/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root
--enable-languages=all,obj-c++ --disable-multilib
Thread model: win32
gcc version 4.4.0 20090201 (experimental) (GCC)
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'main.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/cc1plus -E
-quiet -v -iprefix
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/ main.cpp
-mtune=generic -O2 -fpch-preprocess -o main.ii
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/x86_64-pc-mingw32"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/backward"
ignoring nonexistent directory
"/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root/usr/local/include"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/include"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/include-fixed"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include"
ignoring nonexistent directory
"/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root/mingw/include64"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/x86_64-pc-mingw32
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/backward
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/include
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/include-fixed
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include
End of search list.
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'main.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/cc1plus
-fpreprocessed main.ii -quiet -dumpbase main.cpp -mtune=generic -auxbase-strip
main.o -O2 -version -o main.s
GNU C++ (GCC) version 4.4.0 20090201 (experimental) (x86_64-pc-mingw32)
compiled by GNU C version 4.3.2 20081105 (Red Hat 4.3.2-7), GMP version
4.2.2, MPFR version 2.3.2.
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 687eedcb9489aad6b91e300931a51b03
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'main.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/bin/as
-o main.o main.s
COMPILER_PATH=/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/:/usr/local/opt/mingw64/bin/../libexec/gcc/:/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/bin/
LIBRARY_PATH=/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/:/usr/local/opt/mingw64/bin/../lib/gcc/:/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/lib/
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'main.o'
'-shared-libgcc' '-mtune=generic'
x86_64-pc-mingw32-g++ -O2 -v -save-temps -c -o other.o other.cpp
Using built-in specs.
Target: x86_64-pc-mingw32
Configured with: ../gcc/configure --target=x86_64-pc-mingw32
--prefix=/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root
--with-sysroot=/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root
--enable-languages=all,obj-c++ --disable-multilib
Thread model: win32
gcc version 4.4.0 20090201 (experimental) (GCC)
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'other.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/cc1plus -E
-quiet -v -iprefix
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/ other.cpp
-mtune=generic -O2 -fpch-preprocess -o other.ii
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/x86_64-pc-mingw32"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/backward"
ignoring nonexistent directory
"/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root/usr/local/include"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/include"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/include-fixed"
ignoring duplicate directory
"/usr/local/opt/mingw64/bin/../lib/gcc/../../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include"
ignoring nonexistent directory
"/opt/buildbot/mingw-w64/slave-linux/linux-i386/build/root/mingw/include64"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/x86_64-pc-mingw32
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include/c++/4.4.0/backward
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/include
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/include-fixed
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/include
End of search list.
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'other.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/cc1plus
-fpreprocessed other.ii -quiet -dumpbase other.cpp -mtune=generic
-auxbase-strip other.o -O2 -version -o other.s
GNU C++ (GCC) version 4.4.0 20090201 (experimental) (x86_64-pc-mingw32)
compiled by GNU C version 4.3.2 20081105 (Red Hat 4.3.2-7), GMP version
4.2.2, MPFR version 2.3.2.
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: 687eedcb9489aad6b91e300931a51b03
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'other.o'
'-shared-libgcc' '-mtune=generic'
/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/bin/as
-o other.o other.s
COMPILER_PATH=/usr/local/opt/mingw64/bin/../libexec/gcc/x86_64-pc-mingw32/4.4.0/:/usr/local/opt/mingw64/bin/../libexec/gcc/:/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/bin/
LIBRARY_PATH=/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/:/usr/local/opt/mingw64/bin/../lib/gcc/:/usr/local/opt/mingw64/bin/../lib/gcc/x86_64-pc-mingw32/4.4.0/../../../../x86_64-pc-mingw32/lib/
COLLECT_GCC_OPTIONS='-O2' '-v' '-save-temps' '-c' '-o' 'other.o'
'-shared-libgcc' '-mtune=generic'
x86_64-pc-mingw32-g++ main.o other.o -o a.exe
--
Summary: incorrect value of a static const double class member
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Severity: critical
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: alexey dot pushkin at mererand dot com
GCC build triplet: i386-pc-linux (I think)
GCC host triplet: i386-pc-linux
GCC target triplet: x86_64-pc-mingw32
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39112