On 5 March 2016 at 01:06, David Malcolm <[email protected]> wrote:
> On Wed, 2016-02-24 at 17:56 +0530, Prasad Ghangal wrote:
>> 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
>> }
>> ^
>
> Those caret locations look wrong to me - they don't seem to be
> underlining the pertinent source. Is that what the patched compiler is
> printing, or did things get messed up somewhere via email?
>
> (I tried the patch, but it didn't quite apply cleanly against my
> working copy)
>
> As mentioned before, I think the ideal behavior would be to underline
> *all* of the surplus elements, like this:
>
> 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
> }
> ^
>
> You can use "make_location" to build a range; see e.g. this fragment
> from the C++ frontend:
>
> /* Create a location of the form:
> type_name{i, f}
> ^~~~~~~~~~~~~~~
> with caret == start at the start of the type name,
> finishing at the closing brace. */
> location_t finish_loc
> = get_finish (cp_lexer_previous_token (parser->lexer)->location);
> location_t combined_loc = make_location (start_loc, start_loc,
> finish_loc);
>
> You could do something similar, building a range covering the start of
> the first surplus initializer through to the end of the last surplus
> initializer.
>
> You can then emit an error_at combined_loc, via error_at.
>
> For an example of how to write a test case for underlines, see the
> testsuite part of:
> https://gcc.gnu.org/ml/gcc-patches/2015-12/msg01684.html
>
>
> For bonus points, it's also possible to add a 2nd location for the
> message, by using error_at_richloc, so that you could underline the
> array size:
>
> 68425.c:9:37: warning: excess elements in array initializer (6
> elements,
> expected 3)
> const int array6[3] = {1, 2, 3, 6, 89, 193};
>
> ~ ^~~~~~~~~~
>
How can I get location of array size?
> Or do that in the followup note, for something like:
>
> 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:12: note: (near initialization for ‘array6’)
> const int array6[3] = {1, 2, 3, 6, 89, 193;
> ^
>
> but maybe that's over-ambitious for now.
>
> Hope this is constructive.
> Dave
Also for
int array[10];
array[100]=10;
Currently, GCC doesn't emit any warning (even with -Wall option)
Wouldn't it be nice if GCC gives some warning like Clang, which gives:
foo.c:4:3: warning: array index 100 is past the end of the array
(which contains 10 elements) [-Warray-bounds]
array[100]=10;
^ ~~~
Thanks,
Prasad Ghangal