2018-02-16 Jakub Jelinek <jakub@redhat.com>
+ PR bootstrap/84405
+ * system.h (BROKEN_VALUE_INITIALIZATION): Define for GCC < 4.3.
+ * vec.h (vec_default_construct): Use memset instead of placement new
+ if BROKEN_VALUE_INITIALIZATION is defined.
+ * hash-table.h (hash_table<Descriptor, Allocator>::empty_slow): Use
+ memset instead of value initialization if BROKEN_VALUE_INITIALIZATION
+ is defined.
+
PR rtl-optimization/83723
* lra-int.h (lra_substitute_pseudo): Add DEBUG_P argument.
* lra.c (lra_substitute_pseudo): Likewise. If true, use
}
else
{
+#ifndef BROKEN_VALUE_INITIALIZATION
for ( ; size; ++entries, --size)
*entries = value_type ();
+#else
+ memset (entries, 0, size * sizeof (value_type));
+#endif
}
m_n_deleted = 0;
m_n_elements = 0;
/* Some compilers do not allow the use of unsigned char in bitfields. */
#define BOOL_BITFIELD unsigned int
+/* GCC older than 4.4 have broken C++ value initialization handling, see
+ PR11309, PR30111, PR33916, PR82939 and PR84405 for more details. */
+#if GCC_VERSION > 0 && GCC_VERSION < 4004 && !defined(__clang__)
+# define BROKEN_VALUE_INITIALIZATION
+#endif
+
/* As the last action in this file, we poison the identifiers that
shouldn't be used. Note, luckily gcc-3.0's token-based integrated
preprocessor won't trip on poisoned identifiers that arrive from
inline void
vec_default_construct (T *dst, unsigned n)
{
+#ifndef BROKEN_VALUE_INITIALIZATION
for ( ; n; ++dst, --n)
::new (static_cast<void*>(dst)) T ();
+#else
+ memset (dst, '\0', sizeof (T) * n);
+#endif
}
/* Copy-construct N elements in DST from *SRC. */