re PR bootstrap/84405 (Fails to bootstrap with GCC 4.1.2, GCC 4.2.4)
authorJakub Jelinek <jakub@redhat.com>
Mon, 26 Feb 2018 14:37:45 +0000 (15:37 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 26 Feb 2018 14:37:45 +0000 (15:37 +0100)
PR bootstrap/84405
* vec.h (vec_default_construct): For BROKEN_VALUE_INITIALIZATION use
memset and value initialization afterwards.

From-SVN: r257989

gcc/ChangeLog
gcc/vec.h

index 7a070c5f96ba554a32c6c5a7944783e547bbbe55..ebbc25b6c1d1b5f903ba5de0cf8075ccc1efeff1 100644 (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.
index c707bccf51c5583c525dfe6bbcb69b7ed8f59640..4d2046c04af562b06b8a3dbc4d056d7c0dadd8bb 100644 (file)
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -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.  */