Containers default initialization
Jonathan Wakely
jwakely@redhat.com
Mon Jun 5 11:31:00 GMT 2017
On 04/06/17 22:26 +0200, François Dumont wrote:
>Hi
>
> I have eventually adapt the test to all containers and the result
>is successful for map/set/unordered_map/unordered_set. It is failing
>for deque/list/forward_list/vector/vector<bool>.
>
> I even try to change the test to look at the difference between an
>explicit call to the default constructor done through the placement
>new call and an implicit call done on normal declaration. I wondered
>if we would have the same kind of difference we have between a int i;
>and a int i(); I tried to set the stack to ~0 before declaring the
>instance. I know there is no guarantee on the content of the stack for
>the following declaration but do you think it is reliable enough to
>commit it ?
>
> Ok to commit the successful tests ?
No, I'm seeing failures for some of these if I add
// { dg-options "-O0" }
> Franckly I don't understand the result of those tests. I would
>have expect map/set to fail and others to succeed. We might need help
>from compiler guys, no ?
I think your tests are just insufficient. With optimisation enabled
(the testsuite uses -O2 by default) the compiler can remove the memset
just before the __aligned_buffer goes out of scope, because it is
unobservable in a correct program. This is similar to the situation
described at https://gcc.gnu.org/gcc-6/porting_to.html#flifetime-dse
If I change the placement new-expressions to use default-init instead
of value-init and use -O0 then I see all four tests FAIL here:
test_type *tmp = ::new(buf._M_addr()) test_type; // not test_type()
VERIFY( tmp->get_allocator().state == 0 ); // FAIL
I haven't looked into why you're seeing failures for other containers,
but I'm definitely seeing the failures that I expected for maps and
sets.
More information about the Libstdc++
mailing list