aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-06-25 12:43:05 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-06-25 12:43:05 +0000
commit6e07c515168d331a0e05673b7994a5b189ef112f (patch)
treeea22f21c816c1c646178ef9c6cf317e21cc4dec6
parent20cb2258ecac9c5cb651889966ac46f6958aec95 (diff)
downloadgcc-6e07c515168d331a0e05673b7994a5b189ef112f.zip
gcc-6e07c515168d331a0e05673b7994a5b189ef112f.tar.gz
gcc-6e07c515168d331a0e05673b7994a5b189ef112f.tar.bz2
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
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-parser.c3
-rw-r--r--gcc/c/c-typeck.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/pr61162-2.c48
-rw-r--r--gcc/testsuite/gcc.dg/pr61162.c2
6 files changed, 65 insertions, 3 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 955828c..d1837c2 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index f83ccb0..5842320 100644
--- a/gcc/c/c-parser.c
+++ b/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 a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 4deeae7..b62e830 100644
--- a/gcc/c/c-typeck.c
+++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c701691..ac32cce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/gcc.dg/pr61162-2.c b/gcc/testsuite/gcc.dg/pr61162-2.c
new file mode 100644
index 0000000..1045408
--- /dev/null
+++ b/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 a/gcc/testsuite/gcc.dg/pr61162.c b/gcc/testsuite/gcc.dg/pr61162.c
index 00e64b9..8dcb0c8 100644
--- a/gcc/testsuite/gcc.dg/pr61162.c
+++ b/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" } */
}