On 02/16/2018 01:44 PM, Jakub Jelinek 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;
In C++ 98 a type with a constructor cannot be a member of a union
so the above wouldn't be valid but if I understand what you're
trying to do you don't need the member. All you need is a buffer.
Something like this?
char __attribute__ ((aligned (__alignof__ (value_type))))
buf [sizeof (value_type)] = "";
value_type *p = new (buf) value_type ();
*entries = *p;
p->value_type ();
I have no idea if this gets around the bug.
Martin
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.
Jakub