Full example files are here:
The compiled program fails to do binary conversion between float and int. Both
sizeof(int) and sizeof(float) is 4, so the two floats below should have the same
binary representation after being written/read to/from the integer object.
float f1 = 4.5;
int i = *((int*)&f1);
float f2 = *((float*)&i);
assert(f1 == f2);
$ gcc --version
gcc (GCC) 4.0.1 20050727 (Red Hat 4.0.1-5)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -O2 -march=i686 cast-bug.c
a.out: cast-bug.c:8: main: Assertion `f1 == f2' failed.
Created attachment 9739 [details]
.i file that triggers the bug.
Your code violates ISO C aliasing rules. See the docs about -fstrict-aliasing.
I see - thanks!
I didn't use the -Wall options when changing from C++ to C. g++ had the same
problem, but didn't give any warnings with -Wall.
I have filed this enhancment ticket: [Bug c++/23915]
Reopening to ...
Mark as a dup of bug 21920.
*** This bug has been marked as a duplicate of 21920 ***