Hi! As reported recently, my commit to push block scope using pushdecl into their corresponding scope broke compound literals appearing in parameter scope. For those, we can keep the previous behavior, where they stayed at the function scope if they make it all the way there at all, the fix was only needed for block scope compound literals and for those current_function_decl is non-NULL.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2019-01-07 Jakub Jelinek <ja...@redhat.com> PR c/88701 * c-decl.c (build_compound_literal): If not TREE_STATIC, only pushdecl if current_function_decl is non-NULL. * gcc.dg/pr88701.c: New test. --- gcc/c/c-decl.c.jj 2019-01-04 18:53:11.273323060 +0100 +++ gcc/c/c-decl.c 2019-01-07 13:30:23.108161124 +0100 @@ -5437,7 +5437,7 @@ build_compound_literal (location_t loc, pushdecl (decl); rest_of_decl_compilation (decl, 1, 0); } - else + else if (current_function_decl) pushdecl (decl); if (non_const) --- gcc/testsuite/gcc.dg/pr88701.c.jj 2019-01-07 13:35:07.297528147 +0100 +++ gcc/testsuite/gcc.dg/pr88701.c 2019-01-07 13:34:42.237936686 +0100 @@ -0,0 +1,18 @@ +/* PR c/88701 */ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors" } */ + +void foo (int [(int (*)[1]) { 0 } == 0]); +void bar (int n, int [(int (*)[n]) { 0 } == 0]); + +int +baz (int a[(int (*)[1]) { 0 } == 0]) +{ + return a[0]; +} + +int +qux (int n, int a[(int (*)[n]) { 0 } == 0]) +{ + return a[0] + n; +} Jakub