From ff9fccdcb5118d494bba801038a1c334bf2e38fd Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 26 Feb 2018 15:37:45 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/vec.h | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a070c5f96b..ebbc25b6c1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-02-26 Jakub Jelinek + + PR bootstrap/84405 + * vec.h (vec_default_construct): For BROKEN_VALUE_INITIALIZATION use + memset and value initialization afterwards. + 2018-02-26 Christophe Lyon * Makefile.in (lto-wrapper): Use ALL_LINKERFLAGS. diff --git a/gcc/vec.h b/gcc/vec.h index c707bccf51c..4d2046c04af 100644 --- a/gcc/vec.h +++ b/gcc/vec.h @@ -490,12 +490,23 @@ template inline void vec_default_construct (T *dst, unsigned n) { -#ifndef BROKEN_VALUE_INITIALIZATION - for ( ; n; ++dst, --n) - ::new (static_cast(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(dst)) T (); } /* Copy-construct N elements in DST from *SRC. */ -- 2.30.2