diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-12-23 06:32:02 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-12-23 05:32:02 +0000 |
commit | cbf6e52aa53df8528eb21cff83631a0523cae79c (patch) | |
tree | 88603b729da510442c9773f6f802871336123067 | |
parent | b30063377737ba34e9ace3ce285d3bc2eb14d1a3 (diff) | |
download | gcc-cbf6e52aa53df8528eb21cff83631a0523cae79c.zip gcc-cbf6e52aa53df8528eb21cff83631a0523cae79c.tar.gz gcc-cbf6e52aa53df8528eb21cff83631a0523cae79c.tar.bz2 |
re PR rtl-optimization/13394 (noreturn attribute ignored on recursive invokation)
PR optimization/13394
* toplev.c (rest_of_compilation): Move call to
check_function_return_warnings right after the sibcall
optimization pass.
From-SVN: r74961
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/noreturn-7.c | 42 | ||||
-rw-r--r-- | gcc/toplev.c | 12 |
4 files changed, 61 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 81b80df..f87dbac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2003-12-23 Eric Botcazou <ebotcazou@libertysurf.fr> + PR optimization/13394 + * toplev.c (rest_of_compilation): Move call to + check_function_return_warnings right after the sibcall + optimization pass. + +2003-12-23 Eric Botcazou <ebotcazou@libertysurf.fr> + PR c/13382 * c-typeck.c (convert_for_assignment): When converting from integral type to pointer type, always call convert. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf06bea..9095c8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2003-12-23 Eric Botcazou <ebotcazou@libertysurf.fr> + * gcc.dg/noreturn-7.c: New test. + +2003-12-23 Eric Botcazou <ebotcazou@libertysurf.fr> + * gcc.dg/null-pointer-1.c: New test. 2003-12-22 Mark Mitchell <mark@codesourcery.com> diff --git a/gcc/testsuite/gcc.dg/noreturn-7.c b/gcc/testsuite/gcc.dg/noreturn-7.c new file mode 100644 index 0000000..1d94a7c --- /dev/null +++ b/gcc/testsuite/gcc.dg/noreturn-7.c @@ -0,0 +1,42 @@ +/* PR optimization/13394 */ +/* Origin: Carlo Wood <carlo@gcc.gnu.org> */ + +/* Verify that a bogus "function does return" warning is not issued + in presence of tail recursion within a noreturn function. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -Wreturn-type -Wmissing-noreturn" } */ + + +void f(void) __attribute__ ((__noreturn__)); +void _exit(int status) __attribute__ ((__noreturn__)); + +int z = 0; + +void g() +{ + if (++z > 10) + _exit(0); + g(); +} /* { dg-warning "possible candidate" } */ + +void f() +{ + if (++z > 10) + _exit(0); + f(); +} /* { dg-bogus "does return" } */ + +int h() +{ + if (++z > 10) + _exit(0); + return h(); +} /* { dg-bogus "end of non-void function" } */ + +int k() +{ + if (++z > 10) + _exit(0); + k(); +} /* { dg-warning "end of non-void function" } */ diff --git a/gcc/toplev.c b/gcc/toplev.c index 2ed4c31..7d01eb6 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -3144,10 +3144,6 @@ rest_of_compilation (tree decl) delete_unreachable_blocks (); - /* We have to issue these warnings now already, because CFG cleanups - further down may destroy the required information. */ - check_function_return_warnings (); - /* Turn NOTE_INSN_PREDICTIONs into branch predictions. */ if (flag_guess_branch_prob) { @@ -3159,6 +3155,14 @@ rest_of_compilation (tree decl) if (flag_optimize_sibling_calls) rest_of_handle_sibling_calls (insns); + /* We have to issue these warnings now already, because CFG cleanups + further down may destroy the required information. However, this + must be done after the sibcall optimization pass because the barrier + emitted for noreturn calls that are candidate for the optimization + is folded into the CALL_PLACEHOLDER until after this pass, so the + CFG is inaccurate. */ + check_function_return_warnings (); + timevar_pop (TV_JUMP); insn_locators_initialize (); |