[Bug c++/67773] New: dealloc called on temp object before and named object after move, while not being called on named object before move

2015-09-29 Thread awenocur at aol dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67773

Bug ID: 67773
   Summary: dealloc called on temp object before and named object
after move, while not being called on named object
before move
   Product: gcc
   Version: 4.8.4
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
  Assignee: unassigned at gcc dot gnu.org
  Reporter: awenocur at aol dot com
  Target Milestone: ---

Created attachment 36420
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36420&action=edit
pre-processed C++11 file exhibiting this behavior

The problem occurs on line 23813 of the provided .ii file.
An object initialized with specific parameters is dealloc'd once before moving,
and once after moving, while the target of the move is never dealloc'd.

This demo is simplified from a program I'm writing that has to assign an object
with an embedded pointer.  In the original, this object is destroyed twice
separately, resulting in a double free on the pointer.  In the demo there is no
pointer member, but the undesired behavior is the same.
The workaround featured in the demo is the same one that fixed the real
program.

This problem appears to exist on dialects of C++, at least from '03 onward, but
I chose to use C++11, because move constructors can be explicitly declared.  In
C++03, it does the move in the same manner.

compilation command:
c++ -g -O0 -std=c++11 -save-temps -o test test.cpp

GCC info:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls
--with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap
--enable-plugin --with-system-zlib --disable-browser-plugin
--enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686
--with-abi=m64 --with-multilib-list=m32,m64,mx32 --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.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

OS description:
Ubuntu 3.13.0-48.80-generic 3.13.11-ckt16


[Bug c++/67773] destructor called on temp object before and named object after move, while not being called on named object before move

2015-09-29 Thread awenocur at aol dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67773

--- Comment #1 from Adam Wenocur  ---
compiler output:

-*- mode: compilation; default-directory: "~/compiler-test/" -*-  
Compilation started at Wed Sep 30 00:45:55

./compile.sh  

Compilation finished at Wed Sep 30 00:45:55


the command:
./test


[Bug c++/67773] destructor called on temp object before and named object after move, while not being called on named object before move

2015-09-30 Thread awenocur at aol dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67773

--- Comment #4 from Adam Wenocur  ---
(In reply to Jonathan Wakely from comment #3)
> Oh, are you expecting this:
> 
>   a_thing = demo(demo::second);
> 
> to have the same behaviour as this:
> 
>   a_thing.~demo();
>   new(&a_thing) demo(demo::second);
> 
> ?
> 
> That's not how C++ works.

I don't expect the same behavior, however I expect the same end result:

for the destructor to be called on to be called on the named variable before
the move, then for it to be called on the temporary object.


[Bug c++/67773] destructor called on temp object before and named object after move, while not being called on named object before move

2015-09-30 Thread awenocur at aol dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67773

--- Comment #5 from Adam Wenocur  ---
(In reply to Jonathan Wakely from comment #3)
> Oh, are you expecting this:
> 
>   a_thing = demo(demo::second);
> 
> to have the same behaviour as this:
> 
>   a_thing.~demo();
>   new(&a_thing) demo(demo::second);
> 
> ?
> 
> That's not how C++ works.

I don't expect the same behavior, however I expect the same end result:

for the destructor to be called on to be called on the named variable before
the move, then for it to be called on the temporary object.


[Bug c++/67773] destructor called on temp object before and named object after move, while not being called on named object before move

2015-09-30 Thread awenocur at aol dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67773

--- Comment #6 from Adam Wenocur  ---
Whoops! Sorry about the malformed double-post.

Another way of explaining the problem is that the compiler appears to be
suppressing the wrong destructor call.  Since this is a move and not a copy, or
in C++03 it's a copy elision, it should be suppressing the destructor call on
the temporary variable.  It's not doing this though; it's suppressing the first
destructor call on the named variable instead.

When I get a chance, I'll build a GCC for testing purposes.  What version would
be appropriate in this case?  Is 4.8.5 supported?