[2/2] Improve error message for excess elements in array initializer from {"a"}

Message ID 1669828695-18532-2-git-send-email-apinski@marvell.com
State Committed
Commit d56af02fb1fd6eb50beb8a1689cf646bc567dbfc
Headers
Series [1/2] Fix C/107926: Wrong error message when initializing char array |

Commit Message

Li, Pan2 via Gcc-patches Nov. 30, 2022, 5:18 p.m. UTC
  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

Segher Boessenkool Nov. 30, 2022, 11:05 p.m. UTC | #1
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
  
Andreas Schwab Nov. 30, 2022, 11:17 p.m. UTC | #2
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\]' ...}.
  
Segher Boessenkool Nov. 30, 2022, 11:31 p.m. UTC | #3
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
  
Jeff Law April 30, 2023, 4:24 p.m. UTC | #4
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
  

Patch

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 0fc382c..f1a1752 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -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)
diff --git a/gcc/testsuite/gcc.dg/init-bad-1.c b/gcc/testsuite/gcc.dg/init-bad-1.c
index 0da10c3..7c80006 100644
--- a/gcc/testsuite/gcc.dg/init-bad-1.c
+++ b/gcc/testsuite/gcc.dg/init-bad-1.c
@@ -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 = { };
diff --git a/gcc/testsuite/gcc.dg/init-bad-2.c b/gcc/testsuite/gcc.dg/init-bad-2.c
index 4775c48..57fd9f9 100644
--- a/gcc/testsuite/gcc.dg/init-bad-2.c
+++ b/gcc/testsuite/gcc.dg/init-bad-2.c
@@ -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 };
diff --git a/gcc/testsuite/gcc.dg/init-bad-3.c b/gcc/testsuite/gcc.dg/init-bad-3.c
index c5c338d..c22e8ec 100644
--- a/gcc/testsuite/gcc.dg/init-bad-3.c
+++ b/gcc/testsuite/gcc.dg/init-bad-3.c
@@ -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 };
diff --git a/gcc/testsuite/gcc.dg/init-excess-3.c b/gcc/testsuite/gcc.dg/init-excess-3.c
index 7741261..c03a984 100644
--- a/gcc/testsuite/gcc.dg/init-excess-3.c
+++ b/gcc/testsuite/gcc.dg/init-excess-3.c
@@ -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 } */
diff --git a/gcc/testsuite/gcc.dg/pr61096-1.c b/gcc/testsuite/gcc.dg/pr61096-1.c
index f41789c..90ffb80 100644
--- a/gcc/testsuite/gcc.dg/pr61096-1.c
+++ b/gcc/testsuite/gcc.dg/pr61096-1.c
@@ -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)