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