http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874

--- Comment #9 from Ilya Murav'jov <muravev at yandex dot ru> 2010-10-06 
19:43:30 UTC ---
I've come across another weird warning emission in g++ 4.4:

$ cat test.cc
#include <new>
struct interface_type {

    virtual interface_type* clone(void* storage) const
    {
        return ::new (storage) interface_type();
    }
};

struct poly_base {

    poly_base(const interface_type& x) { x.clone(data); }

    typedef char storage_t[100];
    storage_t data;
};

struct instance_t: interface_type {};

int main()
{
    instance_t pi;
    poly_base p1(pi);

    interface_type* ptr = (interface_type*)(p1.data);
    poly_base p2(*ptr);
}
$ g++ -O3 -Wstrict-aliasing test.cc -o /dev/null
test.cc: In function ‘int main()’:
test.cc:12: warning: dereferencing pointer ‘ptr’ does break strict-aliasing
rules
test.cc:25: note: initialized from here

$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9'
--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 --enable-linker-build-id --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-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic
--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

I get this only in g++ 4.4, g++ 4.5 does not warn.

I want to note that this is a different type of warning about strict-aliasing
rules, likely a more serious one. Can anyone tell what a difference between
"warning: dereferencing type-punned pointer will break strict-aliasing rules"
and "warning: dereferencing pointer ‘ptr’ does break strict-aliasing rules"?

Reply via email to