On Mon, 30 Mar 2020, Jakub Jelinek wrote:

> On Fri, Mar 27, 2020 at 09:09:42PM +0100, Richard Biener wrote:
> > Sounds worth a try. 
> 
> Unfortunately that FAILed miserably:
> +FAIL: g++.dg/cpp0x/constexpr-object1.C  -std=c++11 (test for excess errors)
> +FAIL: g++.dg/cpp0x/constexpr-object1.C  -std=c++14 (test for excess errors)
> +FAIL: g++.dg/cpp0x/constexpr-rom.C  -std=c++11  scan-assembler rodata
> +FAIL: g++.dg/cpp0x/constexpr-rom.C  -std=c++14  scan-assembler rodata
> +FAIL: g++.dg/cpp0x/constexpr-rom.C  -std=c++17  scan-assembler rodata
> +FAIL: g++.dg/cpp0x/constexpr-rom.C  -std=c++2a  scan-assembler rodata
> +FAIL: g++.dg/cpp0x/constexpr-static.C  -std=gnu++11  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static.C  -std=gnu++14  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static.C  -std=gnu++17  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static.C  -std=gnu++2a  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static3.C  -std=gnu++11  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static3.C  -std=gnu++14  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static3.C  -std=gnu++17  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/constexpr-static3.C  -std=gnu++2a  scan-assembler-not 
> static_initialization
> +FAIL: g++.dg/cpp0x/pr78765.C  -std=c++11 (test for excess errors)
> +FAIL: g++.dg/cpp0x/pr78765.C  -std=c++14 (test for excess errors)
> +FAIL: g++.dg/cpp0x/pr78765.C  -std=c++17 (test for excess errors)
> +FAIL: g++.dg/cpp0x/pr78765.C  -std=c++2a (test for excess errors)
> +FAIL: g++.dg/cpp1y/constexpr-empty3.C  -std=c++14  scan-assembler-not 
> static_init
> +FAIL: g++.dg/cpp1y/constexpr-empty3.C  -std=c++17  scan-assembler-not 
> static_init
> +FAIL: g++.dg/cpp1y/constexpr-empty3.C  -std=c++2a  scan-assembler-not 
> static_init
> +FAIL: g++.dg/cpp1z/decomp3.C   (test for excess errors)
> +FAIL: g++.dg/cpp1z/elide2.C  -std=c++11 execution test
> +FAIL: g++.dg/cpp1z/elide2.C  -std=c++14 execution test
> +FAIL: g++.dg/cpp1z/elide2.C  -std=c++17 execution test
> +FAIL: g++.dg/cpp1z/elide2.C  -std=c++2a execution test
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++11  (test for errors, line 6)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++11 (test for excess errors)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++14  (test for errors, line 6)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++14 (test for excess errors)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++17  (test for errors, line 6)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++17 (test for excess errors)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++2a  (test for errors, line 6)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++2a (test for excess errors)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++98  (test for errors, line 6)
> +FAIL: g++.dg/ext/stmtexpr15.C  -std=gnu++98 (test for excess errors)
> +FAIL: g++.dg/other/error19.C  -std=c++11 (test for excess errors)
> +FAIL: g++.dg/other/error19.C  -std=c++14 (test for excess errors)
> +FAIL: g++.dg/other/error19.C  -std=c++17 (test for excess errors)
> +FAIL: g++.dg/other/error19.C  -std=c++2a (test for excess errors)
> +FAIL: g++.dg/other/error19.C  -std=c++98 (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++11 (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++11 17 (test for errors, line 6)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++14 (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++14 17 (test for errors, line 6)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++17 (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++17 17 (test for errors, line 6)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++2a (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++2a 17 (test for errors, line 6)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++98 (test for excess errors)
> +FAIL: g++.dg/parse/error26.C  -std=gnu++98 17 (test for errors, line 6)
> +FAIL: g++.dg/tree-ssa/pr69336.C   (test for excess errors)
> +UNRESOLVED: g++.dg/tree-ssa/pr69336.C   scan-tree-dump-not optimized "cmap"
> +FAIL: g++.dg/torture/pr45709-2.C   -O1  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709-2.C   -O1  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2 -flto  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2 -flto  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2 -flto -flto-partition=none  (internal 
> compiler error)
> +FAIL: g++.dg/torture/pr45709-2.C   -O2 -flto -flto-partition=none  (test for 
> excess errors)
> +FAIL: g++.dg/torture/pr45709-2.C   -O3 -g  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709-2.C   -O3 -g  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -O1  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -O1  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -O2  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -O2  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -O2 -flto  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -O2 -flto  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -O2 -flto -flto-partition=none  (internal 
> compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -O2 -flto -flto-partition=none  (test for 
> excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -O3 -g  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -O3 -g  (test for excess errors)
> +FAIL: g++.dg/torture/pr45709.C   -Os  (internal compiler error)
> +FAIL: g++.dg/torture/pr45709.C   -Os  (test for excess errors)
> +FAIL: libgomp.c++/ctor-5.C (test for excess errors)
> +UNRESOLVED: libgomp.c++/ctor-5.C compilation failed to produce executable
> 
> 2020-03-27  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/93786
>       PR debug/94340
>       * semantics.c (finish_stmt_expr): Force retainment of a STATEMENT_LIST
>       with TREE_SIDE_EFFECTS set on a statement expression.
> 
>       * g++.dg/other/pr93786.C: New test.
>       * g++.dg/other/pr94340.C: New test.
> 
> --- gcc/cp/semantics.c.jj     2020-02-05 23:34:33.341851494 +0100
> +++ gcc/cp/semantics.c        2020-03-27 17:02:27.494528113 +0100
> @@ -2319,7 +2319,13 @@ finish_stmt_expr (tree stmt_expr, bool h
>    gcc_assert (TREE_CODE (stmt_expr) == STATEMENT_LIST);
>  
>    type = TREE_TYPE (stmt_expr);
> +  /* For statement-expressions, force the STATEMENT_LIST
> +     to be preserved with side-effects, even if it contains
> +     just one statement or no statements.  See PR93786.  */
> +  TREE_SIDE_EFFECTS (stmt_expr) = 0;
>    result = pop_stmt_list (stmt_expr);
> +  gcc_assert (result == stmt_expr);
> +  TREE_SIDE_EFFECTS (result) = 1;

The original code had !TREE_SIDE_EFFECT stmt lists (empty ones?) returned
directly which you above change to have side-effects - are you sure
the fallout is not due to that?  Did you look into any of the fallout?

But yeah, the fallout is probably just the tip of another iceberg...

Richard.

>    TREE_TYPE (result) = type;
>  
>    if (processing_template_decl)
> --- gcc/testsuite/g++.dg/other/pr93786.C.jj   2020-03-27 17:10:51.337993640 
> +0100
> +++ gcc/testsuite/g++.dg/other/pr93786.C      2020-02-25 13:46:08.209039387 
> +0100
> @@ -0,0 +1,11 @@
> +// PR middle-end/93786
> +// { dg-do compile }
> +// { dg-options "-O2 -fcompare-debug" }
> +
> +struct S { virtual void bar (); };
> +
> +void
> +foo (S *s)
> +{
> +  ({ s; })->bar ();
> +}
> --- gcc/testsuite/g++.dg/other/pr94340.C.jj   2020-03-27 17:13:15.859832404 
> +0100
> +++ gcc/testsuite/g++.dg/other/pr94340.C      2020-03-27 17:14:26.043782842 
> +0100
> @@ -0,0 +1,16 @@
> +// PR debug/94340
> +// { dg-do compile }
> +// { dg-options "-O -fcompare-debug" }
> +
> +struct D { int i; D (); ~D (); };
> +D foo ();
> +
> +void
> +bar (void)
> +{
> +  if (
> +      ({
> +         foo ();
> +       }).i)
> +    return;
> +}
> 
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to