aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-12-23 06:32:02 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-12-23 05:32:02 +0000
commitcbf6e52aa53df8528eb21cff83631a0523cae79c (patch)
tree88603b729da510442c9773f6f802871336123067
parentb30063377737ba34e9ace3ce285d3bc2eb14d1a3 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/noreturn-7.c42
-rw-r--r--gcc/toplev.c12
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 ();