diff options
author | Marek Polacek <polacek@redhat.com> | 2014-06-25 12:43:05 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2014-06-25 12:43:05 +0000 |
commit | 6e07c515168d331a0e05673b7994a5b189ef112f (patch) | |
tree | ea22f21c816c1c646178ef9c6cf317e21cc4dec6 /gcc | |
parent | 20cb2258ecac9c5cb651889966ac46f6958aec95 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 3 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr61162-2.c | 48 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr61162.c | 2 |
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" } */ } |