Commit 6e07c515 by Marek Polacek Committed by Marek Polacek

re PR c/61162 (possibly bad error location with -Wc++-compat)

	PR c/61162
	* c-parser.c (c_parser_statement_after_labels): Pass the location of
	the return expression to c_finish_return.

	* gcc.dg/pr61162.c: Adjust dg-warning.
	* gcc.dg/pr61162-2.c: New test.

From-SVN: r211978
parent 20cb2258
2014-06-25 Marek Polacek <polacek@redhat.com>
PR c/61162
* c-parser.c (c_parser_statement_after_labels): Pass the location of
the return expression to c_finish_return.
2014-06-25 Jakub Jelinek <jakub@redhat.com>
* c-typeck.c (c_finish_omp_clauses): Make sure
......
......@@ -4948,9 +4948,10 @@ c_parser_statement_after_labels (c_parser *parser)
}
else
{
location_t xloc = c_parser_peek_token (parser)->location;
struct c_expr expr = c_parser_expression_conv (parser);
mark_exp_read (expr.value);
stmt = c_finish_return (loc, expr.value, expr.original_type);
stmt = c_finish_return (xloc, expr.value, expr.original_type);
goto expect_semicolon;
}
break;
......
......@@ -9185,7 +9185,8 @@ c_finish_goto_ptr (location_t loc, tree expr)
/* Generate a C `return' statement. RETVAL is the expression for what
to return, or a null pointer for `return;' with no value. LOC is
the location of the return statement. If ORIGTYPE is not NULL_TREE, it
the location of the return statement, or the location of the expression,
if the statement has any. If ORIGTYPE is not NULL_TREE, it
is the original type of RETVAL. */
tree
......
2014-06-25 Marek Polacek <polacek@redhat.com>
PR c/61162
* gcc.dg/pr61162.c: Adjust dg-warning.
* gcc.dg/pr61162-2.c: New test.
2014-06-25 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/57742
......
/* PR c/61162 */
/* { dg-do compile } */
/* { dg-options "-Wc++-compat -Wpointer-sign -Wpedantic" } */
enum e { A };
struct s { int a; };
enum e
fn1 (void)
{
return 0; /* { dg-warning "10:enum conversion in return" } */
}
int
fn2 (struct s s)
{
return s; /* { dg-error "10:incompatible types when returning" } */
}
void
fn3 (void)
{
return 3; /* { dg-warning "10:in function returning void" } */
}
int
fn4 (int *a)
{
return a; /* { dg-warning "10:return makes integer from pointer without a cast" } */
}
int *
fn5 (int a)
{
return a; /* { dg-warning "10:return makes pointer from integer without a cast" } */
}
unsigned int *
fn6 (int *i)
{
return i; /* { dg-warning "10:pointer targets in return differ" } */
}
void *
fn7 (void (*fp) (void))
{
return fp; /* { dg-warning "10:ISO C forbids return between function pointer" } */
}
......@@ -8,5 +8,5 @@ fn1 (void)
{
enum e e, q = 0; /* { dg-warning "17:enum conversion in initialization is invalid" } */
e = 0; /* { dg-warning "5:enum conversion in assignment is invalid" } */
1; return 0; /* { dg-warning "6:enum conversion in return is invalid" } */
1; return 0; /* { dg-warning "13:enum conversion in return is invalid" } */
}
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