--- Comment #1 from pinskia at gmail dot com 2010-05-18 03:50 ---
Subject: Re: New: Wrong code generated with -O2 and above
Sent from my iPhone
On May 17, 2010, at 8:37 PM, "eyakubovich at gmail dot com"
wrote:
> This is a stripped down code from proposed Boost.Move library.
> Asserts don't
> fire with -O0 and -O1 but do with -O2 and -O3
>
> #include
>
> template
> class rv : public T
> {
> rv();
> ~rv();
> rv(rv const&);
> void operator=(rv const&);
> };
>
> template
> rv& move(T& x)
> {
> return *static_cast* >(&x);
> }
>
> //A movable class
> class movable
> {
> movable(movable &);
> movable& operator=(movable&);
> public:
> operator rv&()
> { return *reinterpret_cast< rv* >(this); }
> operator const rv&() const
> { return *reinterpret_cast* >(this); }
>
> private:
> int value_;
>
> public:
> movable() : value_(1){}
>
> //Move constructor and assignment
> movable(rv& m)
> { value_ = m.value_; m.value_ = 0; }
>
> movable & operator=(rv& m)
> { value_ = m.value_; m.value_ = 0; return *this; }
>
> bool moved() const //Observer
> { return value_ == 0; }
> };
>
> movable function(movable m)
> {
> return movable(move(m));
> }
>
> int main()
> {
> {
> movable m;
> movable m2(move(m));
The above code cause aliasing violations because you acess a movable
object via a rv (from now on just refered to as rv for short)
one. So you have a type rv who's base type is movable. note both rv
and movable are non pods which I think removes the case for upcasting
and then accessing the first member.
> assert(m.moved());
> assert(!m2.moved());
> }
>
> {
> movable m;
> movable m3(function(movable(move(m;
> assert(m.moved());
> assert(!m3.moved());
> }
>
> {
> movable m;
> movable m4(function(move(m)));
> assert(m.moved());
> assert(!m4.moved());
> }
>
> return 0;
> }
>
>
> --
> Summary: Wrong code generated with -O2 and above
> Product: gcc
> Version: 4.4.4
>Status: UNCONFIRMED
> Severity: normal
> Priority: P3
> Component: c++
>AssignedTo: unassigned at gcc dot gnu dot org
>ReportedBy: eyakubovich at gmail dot com
>
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44186
>
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44186