Patchwork [C] Better column info for return stmts (PR c/61162)

login
register
mail settings
Submitter Marek Polacek
Date June 25, 2014, 11:59 a.m.
Message ID <20140625115952.GA489@redhat.com>
Download mbox | patch
Permalink /patch/363959/
State New
Headers show

Comments

Marek Polacek - June 25, 2014, 11:59 a.m.
This is the last piece to fix PR61162: it's better to point to the
expression of the return statement (if any) than to the return keyword
itself.

Tested x86_64-unknown-linux-gnu, applying to trunk.

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.

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


	Marek

Patch

diff --git gcc/c/c-parser.c gcc/c/c-parser.c
index f83ccb0..5842320 100644
--- gcc/c/c-parser.c
+++ gcc/c/c-parser.c
@@ -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;
diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c
index 4deeae7..b62e830 100644
--- gcc/c/c-typeck.c
+++ gcc/c/c-typeck.c
@@ -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
diff --git gcc/testsuite/gcc.dg/pr61162-2.c gcc/testsuite/gcc.dg/pr61162-2.c
index e69de29..1045408 100644
--- gcc/testsuite/gcc.dg/pr61162-2.c
+++ gcc/testsuite/gcc.dg/pr61162-2.c
@@ -0,0 +1,48 @@ 
+/* 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" } */
+}
diff --git gcc/testsuite/gcc.dg/pr61162.c gcc/testsuite/gcc.dg/pr61162.c
index 00e64b9..8dcb0c8 100644
--- gcc/testsuite/gcc.dg/pr61162.c
+++ gcc/testsuite/gcc.dg/pr61162.c
@@ -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" } */
 }