On June 10, 2016 9:13:09 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >As can be seen on the following (IMNSHO valid) testcase, we need to >walk >ops of GIMPLE_GOTO, except when it has (non-local) LABEL_DECL in it. >There is code to do this, but it was setting *handled_ops_p to true and >thus not actually walking those (therefore tweaks of wi->* were >useless). > >Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok >for >trunk?
OK. Thanks Richard. >2016-06-10 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/71494 > * tree-nested.c (convert_nonlocal_reference_stmt): For GIMPLE_GOTO > without LABEL_DECL, set *handled_ops_p to false instead of true. > > * gcc.c-torture/execute/pr71494.c: New test. > >--- gcc/tree-nested.c.jj 2016-04-22 18:21:54.000000000 +0200 >+++ gcc/tree-nested.c 2016-06-10 13:29:24.227858894 +0200 >@@ -1332,7 +1332,7 @@ convert_nonlocal_reference_stmt (gimple_ > { > wi->val_only = true; > wi->is_lhs = false; >- *handled_ops_p = true; >+ *handled_ops_p = false; > return NULL_TREE; > } > break; >--- gcc/testsuite/gcc.c-torture/execute/pr71494.c.jj 2016-06-10 >13:33:04.776955077 +0200 >+++ gcc/testsuite/gcc.c-torture/execute/pr71494.c 2016-06-10 >13:32:43.000000000 +0200 >@@ -0,0 +1,22 @@ >+/* PR middle-end/71494 */ >+ >+int >+main () >+{ >+ void *label = &&out; >+ int i = 0; >+ void test (void) >+ { >+ label = &&out2; >+ goto *label; >+ out2:; >+ i++; >+ } >+ goto *label; >+ out: >+ i += 2; >+ test (); >+ if (i != 3) >+ __builtin_abort (); >+ return 0; >+} > > Jakub