Compile attached testcase using: $ g++-4.4 -c -O1 -fstrict-aliasing -Wstrict-aliasing foo.i foo.i: In function ‘bool foo()’: foo.i:8: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules foo.i:26: note: initialized from here
Line 8 has this: 7: APSInt &operator=(const APSInt &RHS) { 8: APInt::operator=(RHS); Line 26 has this: 26: AdditionalOffset = Val.getInt(); None of these violate the strict aliasing rules. The only place that could violate the strict aliasing rules in the testcase is at line 17: 14: void *Data[sizeof(APSInt)]; 15: public: 16: APSInt &getInt() { 17: return *(APSInt*)(void*)Data; g++ 4.3.3 doesn't give any warning, neither does g++ 4.2.4. I think this is a bug because: - the warning is not given at the place that (possibly) violates the strict aliasing rules, but at the place where the pointer obtained by violating the rules is dereferenced. - removing line 26 silences the warning, and no warning given for getInt or operator= anymore Also does the construct at line 17 really violate the aliasing rules? $ g++-4.4 -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.0-1~exp1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-objc-gc --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.4.0 (Debian 4.4.0-1~exp1) -- Summary: Bogus location given for warning, no warning at real location: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: edwintorok at gmail dot com GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39891