+2018-02-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR bootstrap/84405
+ * vec.h (vec_default_construct): For BROKEN_VALUE_INITIALIZATION use
+ memset and value initialization afterwards.
+
2018-02-26 Christophe Lyon <christophe.lyon@linaro.org>
* Makefile.in (lto-wrapper): Use ALL_LINKERFLAGS.
inline void
vec_default_construct (T *dst, unsigned n)
{
-#ifndef BROKEN_VALUE_INITIALIZATION
- for ( ; n; ++dst, --n)
- ::new (static_cast<void*>(dst)) T ();
-#else
+#ifdef BROKEN_VALUE_INITIALIZATION
+ /* Versions of GCC before 4.4 sometimes leave certain objects
+ uninitialized when value initialized, though if the type has
+ user defined default ctor, that ctor is invoked. As a workaround
+ perform clearing first and then the value initialization, which
+ fixes the case when value initialization doesn't initialize due to
+ the bugs and should initialize to all zeros, but still allows
+ vectors for types with user defined default ctor that initializes
+ some or all elements to non-zero. If T has no user defined
+ default ctor and some non-static data members have user defined
+ default ctors that initialize to non-zero the workaround will
+ still not work properly; in that case we just need to provide
+ user defined default ctor. */
memset (dst, '\0', sizeof (T) * n);
#endif
+ for ( ; n; ++dst, --n)
+ ::new (static_cast<void*>(dst)) T ();
}
/* Copy-construct N elements in DST from *SRC. */