On 5 March 2016 at 01:06, David Malcolm <dmalc...@redhat.com> 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