On Tue, Dec 15, 2015 at 09:11:38PM -0500, David Malcolm wrote: > In the C frontend, > c_parser_postfix_expression > after parsing a primary expression passes "loc", the location of the > *first token* in that expression to > c_parser_postfix_expression_after_primary, > which thus discards any range information we had for primary > expressions containing more than one token; we get just the range of > the first token. > > An example of this can be seen in this testcase from: > https://gcc.gnu.org/wiki/ClangDiagnosticsComparison > > void foo(char **argP, char **argQ) > { > (argP - argQ)(); > argP(); > } > > for which trunk currently gives these ranges: > > diagnostic-range-bad-called-object.c:7:3: error: called object is not a > function or function pointer > (argP - argQ)(); > ^ > > diagnostic-range-bad-called-object.c:14:3: error: called object 'argP' is not > a function or function pointer > argP(); > ^~~~ > > The second happens to be correct, but the first is missing > range information. > > The following patch is a one-liner to preserve the expression's location, > changing the first to: > > diagnostic-range-bad-called-object.c:7:9: error: called object is not a > function or function pointer > (argP - argQ)(); > ~~~~~~^~~~~~~ > > and leaving the second unchanged. > > Applying this fix requires tweaking some column numbers for expected > locations in gcc.dg/cast-function-1.c; the output of trunk was of the > form: > > cast-function-1.c:21:7: warning: function called through a non-compatible type > d = ((double (*) (int)) foo1) (i); > ^ > > which the patch changes to: > > cast-function-1.c:21:8: warning: function called through a non-compatible type > d = ((double (*) (int)) foo1) (i); > ~^~~~~~~~~~~~~~~~~~~~~~~~ > > which I feel is an improvement. > > Successfully bootstrapped®rtested on x86_64-pc-linux-gnu. > Adds 6 new PASS results to gcc.sum > > OK for trunk in stage 3? > > gcc/c/ChangeLog: > * c-parser.c (c_parser_postfix_expression): Use EXPR_LOC_OR_LOC > to preserve range information for the primary expression > in the call to c_parser_postfix_expression_after_primary. > > gcc/testsuite/ChangeLog: > * gcc.dg/cast-function-1.c (bar): Update column numbers. > * gcc.dg/diagnostic-range-bad-called-object.c: New test case.
Looks ok. Marek