Hi! After we report various errors about array size, we set for error-recovery the size to be 1, but because size_int_const is false, it still means we pretend the array is a VLA, can emit a second diagnostics in that case etc. E.g. $ ./cc1.unpatched -quiet a.c a.c:1:5: error: size of array ‘f’ has non-integer type 1 | int f[100.0]; | ^ a.c:1:1: warning: variably modified ‘f’ at file scope 1 | int f[100.0]; | ^~~ $ ./cc1 -quiet a.c a.c:1:5: error: size of array ‘f’ has non-integer type 1 | int f[100.0]; | ^
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2020-03-28 Jakub Jelinek <ja...@redhat.com> PR c/93573 * c-decl.c (grokdeclarator): After issuing errors, set size_int_const to true after setting size to integer_one_node. * gcc.dg/pr93573-1.c: New test. --- gcc/c/c-decl.c.jj 2020-03-19 22:55:50.107685767 +0100 +++ gcc/c/c-decl.c 2020-03-27 17:54:16.017024925 +0100 @@ -6416,6 +6416,7 @@ grokdeclarator (const struct c_declarato error_at (loc, "size of unnamed array has non-integer type"); size = integer_one_node; + size_int_const = true; } /* This can happen with enum forward declaration. */ else if (!COMPLETE_TYPE_P (TREE_TYPE (size))) @@ -6427,6 +6428,7 @@ grokdeclarator (const struct c_declarato error_at (loc, "size of unnamed array has incomplete " "type"); size = integer_one_node; + size_int_const = true; } size = c_fully_fold (size, false, &size_maybe_const); @@ -6451,6 +6453,7 @@ grokdeclarator (const struct c_declarato else error_at (loc, "size of unnamed array is negative"); size = integer_one_node; + size_int_const = true; } /* Handle a size folded to an integer constant but not an integer constant expression. */ --- gcc/testsuite/gcc.dg/pr93573-1.c.jj 2020-03-27 17:55:39.085781301 +0100 +++ gcc/testsuite/gcc.dg/pr93573-1.c 2020-03-27 17:56:35.168941677 +0100 @@ -0,0 +1,12 @@ +/* PR c/93573 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void bar (); + +void +foo (char a) +{ + union C { int d[100.0]; char *e; }; /* { dg-error "has non-integer type" } */ + bar ((union C) &a); +} Jakub