mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 15:00:55 +08:00
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
This commit is contained in:
parent
b300633777
commit
cbf6e52aa5
@ -1,3 +1,10 @@
|
||||
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
|
||||
|
@ -1,3 +1,7 @@
|
||||
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.
|
||||
|
42
gcc/testsuite/gcc.dg/noreturn-7.c
Normal file
42
gcc/testsuite/gcc.dg/noreturn-7.c
Normal file
@ -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" } */
|
12
gcc/toplev.c
12
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 ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user