https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93786
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Tried now also: --- gcc/gimplify.c.jj 2020-04-19 12:10:35.700627184 +0200 +++ gcc/gimplify.c 2020-04-21 12:24:41.444307978 +0200 @@ -886,7 +886,11 @@ mostly_copy_tree_r (tree *tp, int *walk_ /* Cope with the statement expression extension. */ else if (code == STATEMENT_LIST) - ; + { + if (!TREE_SIDE_EFFECTS (t)) + if (tree nt = expr_single (t)) + *tp = nt; + } /* Leave the bulk of the work to copy_tree_r itself. */ else --- gcc/testsuite/g++.dg/other/pr94340.C.jj 2020-04-21 12:15:35.855765641 +0200 +++ gcc/testsuite/g++.dg/other/pr94340.C 2020-04-21 12:15:35.855765641 +0200 @@ -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; +} --- gcc/testsuite/g++.dg/other/pr93786.C.jj 2020-04-21 12:15:35.855765641 +0200 +++ gcc/testsuite/g++.dg/other/pr93786.C 2020-04-21 12:15:35.855765641 +0200 @@ -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 (); +} and while it doesn't ICE, it fails -fcompare-debug on both tests. So, I'm afraid I have no further ideas what to do here, everything I've tried didn't work. Alex, do you think you could have a look at this for GCC11? Thanks.