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&regrtested 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

Reply via email to