Message ID | 20200328005608.GW2156@tucnak |
---|---|
State | New |
Headers | show |
Series | c: After issuing errors about array size, for error-recovery don't make the array VLA [PR93573] | expand |
On Sat, 28 Mar 2020, Jakub Jelinek via Gcc-patches wrote: > 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? OK.
--- 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); +}