The following C++ program (preprocessed source attached) produces unexpected results when compiled with -O1 -fstrict-aliasing (as opposed to -O1 only) or with any higher level of optimization (-O2 or -O3). No compilation warnings are emitted in any of the cases.
#include <cassert> #include <string> struct A { A() : _x(0.0), _y(0.0) { } float& f(const int& i) { return (i == 0 ? _x : _y); } float _x, _y; }; struct B { B(const char* s) : _s(s) { } std::string g() { return std::string(_s); } const char* _s; }; A h(const char* s) { if (s == 0) return A(); A a; B b(s); if (b.g().compare(std::string("")) == 0) a.f(0) = a.f(1) = 1.0; else if (b.g().compare(std::string(""))) b.g().compare(std::string("")); return a; } int main() { A a(h("")); assert(a._x > 0.0 && a._y > 0.0); return 0; } Compilation results: $ g++ -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../src/configure --prefix=/opt/gcc-4.1.1 Thread model: posix gcc version 4.1.1 $ g++ -W -Wall -O1 testcase.cc $ ./a.out $ g++ -W -Wall -O1 -fstrict-aliasing testcase.cc $ ./a.out a.out: testcase.cc:34: int main(): Assertion `a._x > 0.0 && a._y > 0.0' failed. Aborted The assertion ceases to fail (with -O1 -fstrict-aliasing) when adding any (single one) of the options -fno-tree-copy-prop, -fno-tree-dce, -fno-tree-salias or -fno-inline to the compiler command line. -- Summary: Unexpected compilation results: -O1 vs. -O1 -fstrict- aliasing Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: heikki dot tauriainen at tkk dot fi GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30088