[2/2] Improve error message for excess elements in array initializer from {"a"}
Checks
Commit Message
From: Andrew Pinski <apinski@marvell.com>
So char arrays are not the only type that be initialized from {"a"}.
We can have wchar_t (L"") and char16_t (u"") types too. So let's
print out the type of the array instead of just saying char.
Note in the testsuite I used regex . to match '[' and ']' as
I could not figure out how many '\' I needed.
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
gcc/c/ChangeLog:
* c-typeck.cc (process_init_element): Print out array type
for excessive elements.
gcc/testsuite/ChangeLog:
* gcc.dg/init-bad-1.c: Update error message.
* gcc.dg/init-bad-2.c: Likewise.
* gcc.dg/init-bad-3.c: Likewise.
* gcc.dg/init-excess-3.c: Likewise.
* gcc.dg/pr61096-1.c: Likewise.
---
gcc/c/c-typeck.cc | 2 +-
gcc/testsuite/gcc.dg/init-bad-1.c | 2 +-
gcc/testsuite/gcc.dg/init-bad-2.c | 2 +-
gcc/testsuite/gcc.dg/init-bad-3.c | 2 +-
gcc/testsuite/gcc.dg/init-excess-3.c | 12 ++++++------
gcc/testsuite/gcc.dg/pr61096-1.c | 2 +-
6 files changed, 11 insertions(+), 11 deletions(-)
Comments
Hi!
On Wed, Nov 30, 2022 at 09:18:15AM -0800, apinski--- via Gcc-patches wrote:
> Note in the testsuite I used regex . to match '[' and ']' as
> I could not figure out how many '\' I needed.
Don't use double quotes then :-) Inside double quotes all of command
substitution, variable substitution, and backslash substitution are
performed. In a regexp you typically want none of this. You usually do
want the whitespace to be significant, so it is good to quote it in
braces though (unless you like quoting all your whitespace).
> -char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char' array initializer" } */
> +char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char.1.' initializer" } */
char u[1] = { "x", "x" }; /* { dg-error {excess elements in 'char[1]' initializer} } */
See <https://www.tcl.tk/man/tcl8.6.13/TclCmd/Tcl.html> for a very short
page that has *all* Tcl syntax!
Segher
On Nov 30 2022, Segher Boessenkool wrote:
> char u[1] = { "x", "x" }; /* { dg-error {excess elements in 'char[1]' initializer} } */
That won't work, as '[1]' is a bracket expression only matching '1'.
You'll need {... 'char\[1\]' ...}.
On Thu, Dec 01, 2022 at 12:17:30AM +0100, Andreas Schwab wrote:
> On Nov 30 2022, Segher Boessenkool wrote:
>
> > char u[1] = { "x", "x" }; /* { dg-error {excess elements in 'char[1]' initializer} } */
>
> That won't work, as '[1]' is a bracket expression only matching '1'.
> You'll need {... 'char\[1\]' ...}.
Heh. Yeah, char\[1]. Sorry.
Segher
On 11/30/22 10:18, apinski--- via Gcc-patches wrote:
> From: Andrew Pinski <apinski@marvell.com>
>
> So char arrays are not the only type that be initialized from {"a"}.
> We can have wchar_t (L"") and char16_t (u"") types too. So let's
> print out the type of the array instead of just saying char.
>
> Note in the testsuite I used regex . to match '[' and ']' as
> I could not figure out how many '\' I needed.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
>
> gcc/c/ChangeLog:
>
> * c-typeck.cc (process_init_element): Print out array type
> for excessive elements.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/init-bad-1.c: Update error message.
> * gcc.dg/init-bad-2.c: Likewise.
> * gcc.dg/init-bad-3.c: Likewise.
> * gcc.dg/init-excess-3.c: Likewise.
> * gcc.dg/pr61096-1.c: Likewise.
OK
jeff
@@ -10631,7 +10631,7 @@ process_init_element (location_t loc, struct c_expr value, bool implicit,
{
if (constructor_stack->replacement_value.value)
{
- error_init (loc, "excess elements in %<char%> array initializer");
+ error_init (loc, "excess elements in %qT initializer", constructor_type);
return;
}
else if (string_flag)
@@ -18,7 +18,7 @@ char s[1] = "x";
char s1[1] = { "x" };
char t[1] = "xy"; /* { dg-warning "initializer-string for array of 'char' is too long" } */
char t1[1] = { "xy" }; /* { dg-warning "initializer-string for array of 'char' is too long" } */
-char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char' array initializer" } */
+char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char.1.' initializer" } */
/* { dg-message "near init" "near" { target *-*-* } .-1 } */
int i = { };
@@ -19,7 +19,7 @@ char s[1] = "x";
char s1[1] = { "x" };
char t[1] = "xy"; /* { dg-warning "initializer-string for array of 'char' is too long" } */
char t1[1] = { "xy" }; /* { dg-warning "initializer-string for array of 'char' is too long" } */
-char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char' array initializer" } */
+char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char.1.' initializer" } */
/* { dg-message "near init" "near" { target *-*-* } .-1 } */
int j = { 1 };
@@ -19,7 +19,7 @@ char s[1] = "x";
char s1[1] = { "x" };
char t[1] = "xy"; /* { dg-error "initializer-string for array of 'char' is too long" } */
char t1[1] = { "xy" }; /* { dg-error "initializer-string for array of 'char' is too long" } */
-char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char' array initializer" } */
+char u[1] = { "x", "x" }; /* { dg-error "excess elements in 'char.1.' initializer" } */
/* { dg-message "near init" "near" { target *-*-* } .-1 } */
int j = { 1 };
@@ -4,12 +4,12 @@
/* { dg-options "" } */
-char s0[] = {"abc",1}; /* { dg-error "array initializer|near init" } */
-char s1[] = {"abc","a"}; /* { dg-error "array initializer|near init" } */
-char s2[] = {1,"abc"}; /* { dg-error "array initializer|near init|computable at load time" } */
+char s0[] = {"abc",1}; /* { dg-error "'char..' initializer|near init" } */
+char s1[] = {"abc","a"}; /* { dg-error "'char..' initializer|near init" } */
+char s2[] = {1,"abc"}; /* { dg-error "'char..' initializer|near init|computable at load time" } */
/* { dg-warning "integer from pointer without a cast" "" { target *-*-* } .-1 } */
-char s3[5] = {"abc",1}; /* { dg-error "array initializer|near init" } */
-char s4[5] = {"abc","a"}; /* { dg-error "array initializer|near init" } */
-char s5[5] = {1,"abc"}; /* { dg-error "array initializer|near init|computable at load time" } */
+char s3[5] = {"abc",1}; /* { dg-error "'char.5.' initializer|near init" } */
+char s4[5] = {"abc","a"}; /* { dg-error "'char.5.' initializer|near init" } */
+char s5[5] = {1,"abc"}; /* { dg-error "'char.5.' initializer|near init|computable at load time" } */
/* { dg-warning "integer from pointer without a cast" "" { target *-*-* } .-1 } */
@@ -47,7 +47,7 @@ __extension__ int a15[10] = {[2 ... 1] = 4 }; /* { dg-error "31:empty index rang
__extension__ int a16[10] = {[2 ... 100] = 4 }; /* { dg-error "31:array index range in initializer exceeds array bounds" } */
int a17[] = { .B = 1 }; /* { dg-error "15:field name not in record or union initializer" } */
int a18[] = { e }; /* { dg-error "15:initializer element is not constant" } */
-char a19[1] = { "x", "x" }; /* { dg-error "22:excess elements in 'char' array initializer" } */
+char a19[1] = { "x", "x" }; /* { dg-error "22:excess elements in 'char.1.' initializer" } */
void
bar (void)