Hi!

On Tue, Mar 21, 2017 at 03:21:11AM +0200, Ville Voutilainen wrote:

Formatting etc. nits:

> 2017-03-21  Ville Voutilainen  <ville.voutilai...@gmail.com>
> 
>     gcc/
> 
>     PR c++/35878

This should go into gcc/cp/ ChangeLog

>     * cp/init.c (std_placement_new_fn_p): New.

without cp/ here.

>     (build_new_1): Call it.

> +/* Determine whether an allocation function is a namespace-scope
> +   non-replaceable placement new function. See DR 1748.
> +   TODO: Enable in all standard modes.  */
> +static bool std_placement_new_fn_p (tree alloc_fn)

static bool
std_placement_new_fn_p (tree alloc_fn)

> @@ -3171,7 +3186,8 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, 
> tree nelts,
>       So check for a null exception spec on the op new we just called.  */
>  
>    nothrow = TYPE_NOTHROW_P (TREE_TYPE (alloc_fn));
> -  check_new = (flag_check_new || nothrow);
> +  check_new = flag_check_new
> +    || (nothrow && !std_placement_new_fn_p (alloc_fn));

This should be either:
  check_new
    = flag_check_new || (nothrow && !std_placement_new_fn_p (alloc_fn));
or
  check_new = (flag_check_new
               || (nothrow && !std_placement_new_fn_p (alloc_fn)));
i.e. || should not be when on next line at different column than
flag_check_new (and the ()s to make emacs happy).

> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/init/pr35878_1.C
> @@ -0,0 +1,21 @@
> +// { dg-options "-O2 --std=gnu++11" }

-O2 -std=gnu++11 is enough, no need for double dash --std=gnu++11.

> +// { dg-do compile }
> +// { dg-final { scan-assembler "test.*%rdi, %rdi" { target i?86-*-* 
> x86_64-*-* } } }

This will surely fail on 32-bit or with -mx32.  So either you need to use it
on { target { { i?86-*-* x86_64-*-* } && lp64 } } only, or perhaps instead
of scanning assembler add -fdump-tree-optimized to dg-options and
scan-tree-dump for the NULL? pointer comparison there.

        Jakub

Reply via email to