> I'll try to make a simple example on which GCC produces bad code. You can find an example below. GCC-4.1 generates bad code (GCC-4.2 is fine). Neither version give a type-punning warning, though. I'm sorry that I didn't check gcc-4.2 before I started this thread.
Geza Here's the code, I couldn't simplify it further to still have bad code with gcc-4.1. gcc version: 4.1.3 20070601 (prerelease) (Debian 4.1.2-12) #include <time.h> class Tuple { public: union { int c[2]; struct { int x, y; }; }; public: Tuple() { } Tuple(int x, int y) : x(x), y(y) { } }; class Vector; class Point: public Tuple { public: Point() { } Point(int x, int y) : Tuple(x, y) { } inline Vector operator-(const Point &other) const; }; class Vector: public Tuple { public: Vector() { } Vector(int x, int y) : Tuple(x, y) { } Point &asPoint() { return reinterpret_cast<Point&>(*this); } Point toPoint() const { return Point(x, y); } }; Vector Point::operator-(const Point &other) const { return Vector(x-other.x, y-other.y); } inline bool foo(int x, Point a) { if (a.x<=x) { return false; } return true; } int main() { Point a; a.x = 1; a.y = 2; time(0); int n = 0; for (int y=0; y<=44; y++) { if (foo(3, (a-a).asPoint())) { n++; } } return n; }