re PR bootstrap/84405 (Fails to bootstrap with GCC 4.1.2, GCC 4.2.4)

PR bootstrap/84405
	* vec.h (vec_default_construct): For BROKEN_VALUE_INITIALIZATION use
	memset and value initialization afterwards.

From-SVN: r257989
This commit is contained in:
Jakub Jelinek 2018-02-26 15:37:45 +01:00 committed by Jakub Jelinek
parent 7518398dce
commit ff9fccdcb5
2 changed files with 21 additions and 4 deletions

View File

@ -1,3 +1,9 @@
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.

View File

@ -490,12 +490,23 @@ template <typename T>
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. */