> Hello.
>
> As I finally hunted issue in Firefox that was responsible for start-up
> segfault, I would like
> to describe a new behavior of the compiler that emits clobbers to class
> constructors (w/ -flifetime-dse).
> As also Richi spotted quite similar issue in openjade package, I think it
> worth for mentioning in porting:
Hi,
thank you for working this out and writting summary. I think in a shorter form
this would make
excellent entry for changes.html, too. We tell about the new feature and warn
users about fallout
that is always good.
Honza
>
> Ok?
> Thanks,
> Martin
> Index: htdocs/gcc-6/porting_to.html
> ===================================================================
> RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-6/porting_to.html,v
> retrieving revision 1.14
> diff --unified -r1.14 porting_to.html
> --- htdocs/gcc-6/porting_to.html 14 Feb 2016 13:13:43 -0000 1.14
> +++ htdocs/gcc-6/porting_to.html 16 Feb 2016 14:41:10 -0000
> @@ -316,7 +316,7 @@
> </code></pre>
>
> <p>
> -Finally, the type and mangling of flexible array members has changed
> +Furthermore, the type and mangling of flexible array members has changed
> from previous releases. While in GCC 5 and prior the type of a flexible
> array member is an array of zero elements (a GCC extension), in GCC 6 it
> is that of an array of an unspecified bound (i.e., <tt>T[]</tt> as opposed
> @@ -324,6 +324,50 @@
> <tt>-fabi-version</tt> or <tt>-Wabi</tt> option to disable or warn about.
> </p>
>
> +<p>
> +Finally, the C++ compiler (with enabled <code>-flifetime-dse</code>)
> +has been more aggressive in dead-store elimination in situations where
> +a memory store to a location precedes a constructor to the
> +memory location. Described situation can be commonly found in programs
> +which zero a memory that is eventually passed to a placement new operator:
> +
> +<pre><code>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <assert.h>
> +
> +struct A
> +{
> + A () {}
> + void *operator new (size_t s)
> + {
> + void *ptr = malloc (s);
> + memset (ptr, 0, s);
> + return ptr;
> + }
> +
> + int value;
> +};
> +
> +A *
> +__attribute__ ((noinline))
> +build (void)
> +{
> + return new A ();
> +}
> +
> +int main()
> +{
> + A *a = build ();
> + assert (a->value == 0); /* Use of uninitialized value */
> + free (a);
> +}
> +</code></pre>
> +
> +If the program cannot be fixed to remove the undefined behavior then
> +the option <code>-fno-lifetime-dse</code> can be used to disable
> +this optimization.
> +
> <h2>-Wmisleading-indentation</h2>
> <p>
> A new warning <code>-Wmisleading-indentation</code> was added