On Fri, 6 Mar 2020 at 00:50, Joseph Myers <jos...@codesourcery.com> wrote:
>
> Bug 93577, apparently a regression (although it isn't very clear to me
> exactly when it was introduced; tests I made with various past
> compilers produced inconclusive results, including e.g. ICEs appearing
> with 64-bit-host compilers for some versions but not 32-bit-host
> compilers for the same versions) is an C front-end tree-checking ICE
> processing initializers for structs using the VLA-in-struct extension.
> There is an error for such initializers, but other processing that
> still takes place for them results in the ICE.
>
> This patch ensures that processing of initializers for variable-size
> types stops earlier to avoid the code that results in the ICE (and
> ensures it stops earlier for error_mark_node to avoid ICEs in the
> check for variable-size types), adjusts the conditions for the "empty
> scalar initializer" diagnostic to avoid consequent excess errors in
> the case of a bad type name, and adds tests for a few variations on
> what such initializers might look like, as well as tests for cases
> identified from ICEs seen with an earlier version of this patch.
>
> Bootstrapped with no regressions for x86_64-pc-linux-gnu.  Applied to
> mainline.
>

Hi Joseph,

I've noticed that your patch introduces regressions on aarch64:
FAIL: gcc.target/aarch64/sve/acle/general-c/sizeless-1.c
-march=armv8.2-a+sve  (test for errors, line 33)
we now get
/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-1.c:33:44:
error: empty scalar initializer
while we expect dg-error {initializer element is not constant}

FAIL: gcc.target/aarch64/sve/acle/general-c/sizeless-1.c
-march=armv8.2-a+sve  (test for errors, line 85)
we no longer emit dg-error {empty scalar initializer }

FAIL: gcc.target/aarch64/sve/acle/general-c/sizeless-1.c
-march=armv8.2-a+sve (test for excess errors)
FAIL: gcc.target/aarch64/sve/acle/general-c/sizeless-2.c
-march=armv8.2-a+sve  (test for errors, line 85)
we no longer emit dg-error {empty scalar initializer }

Since the compiler did not ICE before your patch, is that new
behaviour expected (and the tests need an update), or is that a
problem with the patch?

Thanks,

Christophe



> gcc/c:
> 2020-03-05  Joseph Myers  <jos...@codesourcery.com>
>
>         PR c/93577
>         * c-typeck.c (pop_init_level): Do not diagnose initializers as
>         empty when initialized type is error_mark_node.
>         (set_designator, process_init_element): Ignore initializers for
>         elements of a variable-size type or of error_mark_node.
>
> gcc/testsuite:
> 2020-03-05  Joseph Myers  <jos...@codesourcery.com>
>
>         PR c/93577
>         * gcc.dg/pr93577-1.c, gcc.dg/pr93577-2.c, gcc.dg/pr93577-3.c,
>         gcc.dg/pr93577-4.c, gcc.dg/pr93577-5.c, gcc.dg/pr93577-6.c: New
>         tests.
>         * gcc.dg/vla-init-1.c: Expect fewer errors about VLA initializer.
>
> diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
> index 308fcffcfb0..d8025de1996 100644
> --- a/gcc/c/c-typeck.c
> +++ b/gcc/c/c-typeck.c
> @@ -8759,7 +8759,7 @@ pop_init_level (location_t loc, int implicit,
>          the element, after verifying there is just one.  */
>        if (vec_safe_is_empty (constructor_elements))
>         {
> -         if (!constructor_erroneous)
> +         if (!constructor_erroneous && constructor_type != error_mark_node)
>             error_init (loc, "empty scalar initializer");
>           ret.value = error_mark_node;
>         }
> @@ -8836,8 +8836,8 @@ set_designator (location_t loc, bool array,
>    enum tree_code subcode;
>
>    /* Don't die if an entire brace-pair level is superfluous
> -     in the containing level.  */
> -  if (constructor_type == NULL_TREE)
> +     in the containing level, or for an erroneous type.  */
> +  if (constructor_type == NULL_TREE || constructor_type == error_mark_node)
>      return true;
>
>    /* If there were errors in this designator list already, bail out
> @@ -8845,6 +8845,12 @@ set_designator (location_t loc, bool array,
>    if (designator_erroneous)
>      return true;
>
> +  /* Likewise for an initializer for a variable-size type.  Those are
> +     diagnosed in digest_init.  */
> +  if (COMPLETE_TYPE_P (constructor_type)
> +      && TREE_CODE (TYPE_SIZE (constructor_type)) != INTEGER_CST)
> +    return true;
> +
>    if (!designator_depth)
>      {
>        gcc_assert (!constructor_range_stack);
> @@ -9955,8 +9961,14 @@ process_init_element (location_t loc, struct c_expr 
> value, bool implicit,
>      }
>
>    /* Ignore elements of a brace group if it is entirely superfluous
> -     and has already been diagnosed.  */
> -  if (constructor_type == NULL_TREE)
> +     and has already been diagnosed, or if the type is erroneous.  */
> +  if (constructor_type == NULL_TREE || constructor_type == error_mark_node)
> +    return;
> +
> +  /* Ignore elements of an initializer for a variable-size type.
> +     Those are diagnosed in digest_init.  */
> +  if (COMPLETE_TYPE_P (constructor_type)
> +      && TREE_CODE (TYPE_SIZE (constructor_type)) != INTEGER_CST)
>      return;
>
>    if (!implicit && warn_designated_init && !was_designated
> diff --git a/gcc/testsuite/gcc.dg/pr93577-1.c 
> b/gcc/testsuite/gcc.dg/pr93577-1.c
> new file mode 100644
> index 00000000000..31023d79d99
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-1.c
> @@ -0,0 +1,16 @@
> +/* Test ICE with variable-size struct initializer: bug 93577.  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void
> +f (int c)
> +{
> +  struct s
> +  {
> +    int x[c];
> +    struct
> +    {
> +      int z;
> +    } nest;
> +  } v = { 1, 2 }; /* { dg-error "variable-sized object may not be 
> initialized" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr93577-2.c 
> b/gcc/testsuite/gcc.dg/pr93577-2.c
> new file mode 100644
> index 00000000000..c61589ea670
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-2.c
> @@ -0,0 +1,16 @@
> +/* Test ICE with variable-size struct initializer: bug 93577.  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void
> +f (int c)
> +{
> +  struct s
> +  {
> +    int x[c];
> +    struct
> +    {
> +      int a, b;
> +    } nest;
> +  } v = { .nest.b = 1, .nest.a = 2 }; /* { dg-error "variable-sized object 
> may not be initialized" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr93577-3.c 
> b/gcc/testsuite/gcc.dg/pr93577-3.c
> new file mode 100644
> index 00000000000..278146b16bd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-3.c
> @@ -0,0 +1,17 @@
> +/* Test ICE with variable-size struct initializer: bug 93577.  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void
> +f (int c)
> +{
> +  struct s
> +  {
> +    int a;
> +    int x[c];
> +    struct
> +    {
> +      int a, b;
> +    } nest;
> +  } v = { .a = 2, .nest.b = 1 }; /* { dg-error "variable-sized object may 
> not be initialized" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr93577-4.c 
> b/gcc/testsuite/gcc.dg/pr93577-4.c
> new file mode 100644
> index 00000000000..0ac117c4d77
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-4.c
> @@ -0,0 +1,17 @@
> +/* Test ICE with variable-size struct initializer: bug 93577.  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void
> +f (int c)
> +{
> +  struct s
> +  {
> +    int a;
> +    int x[c];
> +    struct
> +    {
> +      int a, b;
> +    } nest;
> +  } v[2] = { [1].nest.b = 1 }; /* { dg-error "variable-sized object may not 
> be initialized" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr93577-5.c 
> b/gcc/testsuite/gcc.dg/pr93577-5.c
> new file mode 100644
> index 00000000000..68dfc1faaaa
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-5.c
> @@ -0,0 +1,11 @@
> +/* Test ICE with designated initializer in compound literal with bad
> +   type name (ICE seen with early version of fix for bug 93577 but not
> +   covered in other tests).  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void *
> +f (void)
> +{
> +  return &(const bad_type) { .a = 0 }; /* { dg-error "unknown type name" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr93577-6.c 
> b/gcc/testsuite/gcc.dg/pr93577-6.c
> new file mode 100644
> index 00000000000..5ec668fd4df
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr93577-6.c
> @@ -0,0 +1,11 @@
> +/* Test ICE with designated initializer in compound literal with bad
> +   type name (ICE seen with early version of fix for bug 93577 but not
> +   covered in other tests).  */
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +void *
> +f (void)
> +{
> +  return &(const bad_type) { [0] = 0 }; /* { dg-error "unknown type name" } 
> */
> +}
> diff --git a/gcc/testsuite/gcc.dg/vla-init-1.c 
> b/gcc/testsuite/gcc.dg/vla-init-1.c
> index 38e9b011b9c..3125b703451 100644
> --- a/gcc/testsuite/gcc.dg/vla-init-1.c
> +++ b/gcc/testsuite/gcc.dg/vla-init-1.c
> @@ -10,6 +10,4 @@ void
>  foo (void)
>  {
>    int x[a] = { 1 }; /* { dg-error "variable-sized object may not be 
> initialized" "VLA init" } */
> -  /* { dg-warning "excess elements in array initializer" "excess" { target 
> *-*-* } .-1 } */
> -  /* { dg-message "near initialization" "near" { target *-*-* } .-2 } */
>  }
>
> --
> Joseph S. Myers
> jos...@codesourcery.com

Reply via email to