Thanks Prathamesh and Joseph for your suggestions. Here is my updated patch :
for test cases: const int array[5] = {1, 2, 3}; const int array1[3] = {1, 2, 3, 6}; const int array2[4] = {1, 2, 3, 6, 89}; const int array3[5] = {1, 2, 3, 6, 89, 193}; const int array4[3] = {1, 2, 3, 6, 89, 193}; const int array5[1] = {1, 2, 3, 6, 89, 193}; const int array6[3] = {1, 2, 3, 6, 89, 193; const int array7[5] = {1, 2, 3, 6, 89, 193} const int array8[5] = {1, 2, 3, 6, 89, 193 It gives: 68425.c: In function ‘main’: 68425.c:4:37: warning: excess elements in array initializer (4 elements, expected 3) const int array1[3] = {1, 2, 3, 6}; ^ 68425.c:4:37: note: (near initialization for ‘array1’) 68425.c:5:40: warning: excess elements in array initializer (5 elements, expected 4) const int array2[4] = {1, 2, 3, 6, 89}; ^~ 68425.c:5:40: note: (near initialization for ‘array2’) 68425.c:6:44: warning: excess elements in array initializer (6 elements, expected 5) const int array3[5] = {1, 2, 3, 6, 89, 193}; ^~~ 68425.c:6:44: note: (near initialization for ‘array3’) 68425.c:7:37: warning: excess elements in array initializer (6 elements, expected 3) const int array4[3] = {1, 2, 3, 6, 89, 193}; ^ 68425.c:7:37: note: (near initialization for ‘array4’) 68425.c:8:31: warning: excess elements in array initializer (6 elements, expected 1) const int array5[1] = {1, 2, 3, 6, 89, 193}; ^ 68425.c:8:31: note: (near initialization for ‘array5’) 68425.c:9:37: warning: excess elements in array initializer (6 elements, expected 3) const int array6[3] = {1, 2, 3, 6, 89, 193; ^ 68425.c:9:37: note: (near initialization for ‘array6’) 68425.c:9:47: error: expected ‘}’ before ‘;’ token const int array6[3] = {1, 2, 3, 6, 89, 193; ^ 68425.c:14:1: error: expected declaration or statement at end of input } ^ Any suggestions? -- Thanks and Regards, Prasad Ghangal
Index: gcc/c/c-parser.c =================================================================== diff --git a/trunk/gcc/c/c-parser.c b/trunk/gcc/c/c-parser.c --- a/trunk/gcc/c/c-parser.c (revision 233263) +++ b/trunk/gcc/c/c-parser.c (working copy) @@ -1264,6 +1264,7 @@ NUM_PRECS }; +extern void pedwarn_init (location_t, int, const char *, ...); static void c_parser_external_declaration (c_parser *); static void c_parser_asm_definition (c_parser *); static void c_parser_declaration_or_fndef (c_parser *, bool, bool, bool, @@ -1294,9 +1295,11 @@ static struct c_type_name *c_parser_type_name (c_parser *); static struct c_expr c_parser_initializer (c_parser *); static struct c_expr c_parser_braced_init (c_parser *, tree, bool); -static void c_parser_initelt (c_parser *, struct obstack *); +static void c_parser_initelt (c_parser *, struct obstack *, bool *, location_t *, + HOST_WIDE_INT *, HOST_WIDE_INT *); static void c_parser_initval (c_parser *, struct c_expr *, - struct obstack *); + struct obstack *, bool *, location_t *, HOST_WIDE_INT *, + HOST_WIDE_INT *); static tree c_parser_compound_statement (c_parser *); static void c_parser_compound_statement_nostart (c_parser *); static void c_parser_label (c_parser *); @@ -4347,9 +4350,14 @@ { /* Parse a non-empty initializer list, possibly with a trailing comma. */ + bool to_warn = false; + location_t warn_loc = 0; + HOST_WIDE_INT warn_extra_elements = 0; + HOST_WIDE_INT warn_expected_elements = 0; while (true) { - c_parser_initelt (parser, &braced_init_obstack); + c_parser_initelt (parser, &braced_init_obstack, &to_warn, + &warn_loc, &warn_extra_elements, &warn_expected_elements); if (parser->error) break; if (c_parser_next_token_is (parser, CPP_COMMA)) @@ -4359,6 +4367,13 @@ if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) break; } + if(to_warn == true && !(parser->error)) + { + pedwarn_init (warn_loc, 0, "excess elements in array initializer " + "(%wu elements, expected %wu)", + warn_expected_elements + warn_extra_elements, + warn_expected_elements); + } } c_token *next_tok = c_parser_peek_token (parser); if (next_tok->type != CPP_CLOSE_BRACE) @@ -4382,7 +4397,9 @@ /* Parse a nested initializer, including designators. */ static void -c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack) +c_parser_initelt (c_parser *parser, struct obstack * braced_init_obstack, + bool *to_warn, location_t *warn_loc, HOST_WIDE_INT *warn_extra_elements, + HOST_WIDE_INT *warn_expected_elements) { /* Parse any designator or designator list. A single array designator may have the subsequent "=" omitted in GNU C, but a @@ -4516,7 +4533,8 @@ /* Now parse and process the remainder of the initializer, starting with this message expression as a primary-expression. */ - c_parser_initval (parser, &mexpr, braced_init_obstack); + c_parser_initval (parser, &mexpr, braced_init_obstack, to_warn, + warn_loc, warn_extra_elements, warn_expected_elements); return; } c_parser_consume_token (parser); @@ -4576,7 +4594,8 @@ } } } - c_parser_initval (parser, NULL, braced_init_obstack); + c_parser_initval (parser, NULL, braced_init_obstack, to_warn, + warn_loc, warn_extra_elements, warn_expected_elements); } /* Parse a nested initializer; as c_parser_initializer but parses @@ -4587,7 +4606,9 @@ static void c_parser_initval (c_parser *parser, struct c_expr *after, - struct obstack * braced_init_obstack) + struct obstack * braced_init_obstack, bool *to_warn, + location_t *warn_loc, HOST_WIDE_INT *warn_extra_elements, + HOST_WIDE_INT *warn_expected_elements) { struct c_expr init; gcc_assert (!after || c_dialect_objc ()); @@ -4603,7 +4624,9 @@ && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR) init = convert_lvalue_to_rvalue (loc, init, true, true); } - process_init_element (loc, init, false, braced_init_obstack); + process_init_element (loc, init, false, braced_init_obstack, + to_warn, warn_loc, warn_extra_elements, + warn_expected_elements); } /* Parse a compound statement (possibly a function body) (C90 6.6.2, Index: gcc/c/c-tree.h =================================================================== diff --git a/trunk/gcc/c/c-tree.h b/trunk/gcc/c/c-tree.h --- a/trunk/gcc/c/c-tree.h (revision 233263) +++ b/trunk/gcc/c/c-tree.h (working copy) @@ -629,8 +629,11 @@ extern struct c_expr pop_init_level (location_t, int, struct obstack *); extern void set_init_index (location_t, tree, tree, struct obstack *); extern void set_init_label (location_t, tree, struct obstack *); -extern void process_init_element (location_t, struct c_expr, bool, - struct obstack *); +extern void process_init_element (location_t, struct c_expr, bool, + struct obstack *, bool *to_warn = NULL, + location_t *warn_loc = NULL, + HOST_WIDE_INT *warn_extra_elements = 0, + HOST_WIDE_INT *warn_expected_elements = 0); extern tree build_compound_literal (location_t, tree, tree, bool); extern void check_compound_literal_type (location_t, struct c_type_name *); extern tree c_start_case (location_t, location_t, tree, bool); Index: gcc/c/c-typeck.c =================================================================== diff --git a/trunk/gcc/c/c-typeck.c b/trunk/gcc/c/c-typeck.c --- a/trunk/gcc/c/c-typeck.c (revision 233263) +++ b/trunk/gcc/c/c-typeck.c (working copy) @@ -5855,19 +5855,26 @@ it is unconditionally given. GMSGID identifies the message. The component name is taken from the spelling stack. */ -static void -pedwarn_init (location_t location, int opt, const char *gmsgid) +void +pedwarn_init (location_t location, int opt, const char *gmsgid, ...) { char *ofwhat; bool warned; + diagnostic_info diagnostic; + va_list ap; + rich_location richloc (line_table, location); + va_start (ap, gmsgid); + diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN); + diagnostic.option_index = opt; + /* The gmsgid may be a format string with %< and %>. */ - warned = pedwarn (location, opt, gmsgid); + warned = report_diagnostic (&diagnostic); ofwhat = print_spelling ((char *) alloca (spelling_length () + 1)); if (*ofwhat && warned) inform (location, "(near initialization for %qs)", ofwhat); + va_end (ap); } - /* Issue a warning for a bad initializer component. OPT is the OPT_W* value corresponding to the warning option that @@ -8967,7 +8974,9 @@ void process_init_element (location_t loc, struct c_expr value, bool implicit, - struct obstack * braced_init_obstack) + struct obstack * braced_init_obstack, bool *to_warn, + location_t *warn_loc, HOST_WIDE_INT *warn_extra_elements, + HOST_WIDE_INT *warn_expected_elements) { tree orig_value = value.value; int string_flag = orig_value != 0 && TREE_CODE (orig_value) == STRING_CST; @@ -9269,8 +9278,13 @@ && (tree_int_cst_lt (constructor_max_index, constructor_index) || integer_all_onesp (constructor_max_index))) { - pedwarn_init (loc, 0, - "excess elements in array initializer"); + if (to_warn && *to_warn == false) + { + *to_warn = true; + *warn_expected_elements = tree_to_uhwi (constructor_max_index) + 1; + *warn_loc = loc; + } + ++(*warn_extra_elements); break; }