Commit cbf6e52a by Eric Botcazou Committed by Eric Botcazou

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
parent b3006337
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.
......
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>
......
/* 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" } */
......@@ -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 ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment