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

Reply via email to