On February 16, 2018 9:44:33 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> wrote: >On Fri, Feb 16, 2018 at 09:25:30PM +0100, Richard Biener wrote: >> But the broken compilers will overwrite the memset data with possibly >uninitialized fields of a TARGET_EXPR. > >Perhaps for hash-table.h we could use: >#ifndef BROKEN_VALUE_INITIALIZATION > for ( ; size; ++entries, --size) > *entries = value_type (); >#else > union U { char c[sizeof (value_type)]; value_type v; } u; > memset (u.c, '\0', sizeof (u.c)); > value_type *p = ::new (static_cast<void*>(u.c)) value_type (); > for ( ; size; ++entries, --size) > *entries = *p; > p->~value_type (); >#endif >or so, if it is valid C++, which could turn the hash-table.h case into >the vec.h case.
I don't think a workaround for a non-conforming compiler has to be strictly conforming. And the more complicated we make this the bigger the chances we hit some other latent bug. Richard. > Jakub