Commit a10704e1 by David Malcolm Committed by David Malcolm

C FE: fix range of primary-expression in c_parser_postfix_expression

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.

From-SVN: r231709
parent 0f7a02a3
2015-12-16 David Malcolm <dmalcolm@redhat.com> 2015-12-16 David Malcolm <dmalcolm@redhat.com>
* 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.
2015-12-16 David Malcolm <dmalcolm@redhat.com>
* c-parser.c (c_parser_static_assert_declaration_no_semi): Use the * c-parser.c (c_parser_static_assert_declaration_no_semi): Use the
expression location, falling back on the first token location, expression location, falling back on the first token location,
rather than always using the latter. rather than always using the latter.
......
...@@ -7954,7 +7954,8 @@ c_parser_postfix_expression (c_parser *parser) ...@@ -7954,7 +7954,8 @@ c_parser_postfix_expression (c_parser *parser)
expr.value = error_mark_node; expr.value = error_mark_node;
break; break;
} }
return c_parser_postfix_expression_after_primary (parser, loc, expr); return c_parser_postfix_expression_after_primary
(parser, EXPR_LOC_OR_LOC (expr.value, loc), expr);
} }
/* Parse a postfix expression after a parenthesized type name: the /* Parse a postfix expression after a parenthesized type name: the
......
2015-12-16 David Malcolm <dmalcolm@redhat.com> 2015-12-16 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/cast-function-1.c (bar): Update column numbers.
* gcc.dg/diagnostic-range-bad-called-object.c: New test case.
2015-12-16 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/diagnostic-range-static-assert.c: New test case. * gcc.dg/diagnostic-range-static-assert.c: New test case.
2015-12-16 Marek Polacek <polacek@redhat.com> 2015-12-16 Marek Polacek <polacek@redhat.com>
......
...@@ -18,14 +18,14 @@ typedef struct { ...@@ -18,14 +18,14 @@ typedef struct {
void bar(double d, int i, str_t s) void bar(double d, int i, str_t s)
{ {
d = ((double (*) (int)) foo1) (i); /* { dg-warning "7:non-compatible|abort" } */ d = ((double (*) (int)) foo1) (i); /* { dg-warning "8:non-compatible|abort" } */
i = ((int (*) (double)) foo1) (d); /* { dg-warning "7:non-compatible|abort" } */ i = ((int (*) (double)) foo1) (d); /* { dg-warning "8:non-compatible|abort" } */
s = ((str_t (*) (int)) foo1) (i); /* { dg-warning "7:non-compatible|abort" } */ s = ((str_t (*) (int)) foo1) (i); /* { dg-warning "8:non-compatible|abort" } */
((void (*) (int)) foo1) (d); /* { dg-warning "non-compatible|abort" } */ ((void (*) (int)) foo1) (d); /* { dg-warning "non-compatible|abort" } */
i = ((int (*) (int)) foo1) (i); /* { dg-bogus "non-compatible|abort" } */ i = ((int (*) (int)) foo1) (i); /* { dg-bogus "non-compatible|abort" } */
(void) foo1 (i); /* { dg-bogus "non-compatible|abort" } */ (void) foo1 (i); /* { dg-bogus "non-compatible|abort" } */
d = ((double (*) (int)) foo2) (i); /* { dg-warning "7:non-compatible|abort" } */ d = ((double (*) (int)) foo2) (i); /* { dg-warning "8:non-compatible|abort" } */
i = ((int (*) (double)) foo2) (d); /* { dg-bogus "non-compatible|abort" } */ i = ((int (*) (double)) foo2) (d); /* { dg-bogus "non-compatible|abort" } */
s = ((str_t (*) (int)) foo2) (i); /* { dg-warning "non-compatible|abort" } */ s = ((str_t (*) (int)) foo2) (i); /* { dg-warning "non-compatible|abort" } */
((void (*) (int)) foo2) (d); /* { dg-warning "non-compatible|abort" } */ ((void (*) (int)) foo2) (d); /* { dg-warning "non-compatible|abort" } */
......
/* { dg-options "-fdiagnostics-show-caret" } */
/* Adapted from https://gcc.gnu.org/wiki/ClangDiagnosticsComparison */
void call_of_non_function_ptr (char **argP, char **argQ)
{
(argP - argQ)(); /* { dg-error "called object is not a function or function pointer" } */
/* { dg-begin-multiline-output "" }
(argP - argQ)();
~~~~~~^~~~~~~
{ dg-end-multiline-output "" } */
argP(); /* { dg-error "called object 'argP' is not a function or function pointer" } */
/* { dg-begin-multiline-output "" }
argP();
^~~~
{ dg-end-multiline-output "" }
{ dg-begin-multiline-output "" }
void call_of_non_function_ptr (char **argP, char **argQ)
^~~~
{ dg-end-multiline-output "" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment