re PR middle-end/21728 (Nonlocal goto from an unused nested function)
PR 21728 * tree-cfg.c (remove_bb): Transmute DECL_NONLOCAL labels into FORCED_LABEL labels. From-SVN: r102786
This commit is contained in:
parent
0e44ef6254
commit
bb1ecfe8a9
@ -1,3 +1,9 @@
|
||||
2005-08-05 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR 21728
|
||||
* tree-cfg.c (remove_bb): Transmute DECL_NONLOCAL labels into
|
||||
FORCED_LABEL labels.
|
||||
|
||||
2005-08-05 J"orn Rennecke <joern.rennecke@st.com>
|
||||
|
||||
PR middle-end/23135
|
||||
|
10
gcc/testsuite/gcc.c-torture/compile/pr21728.c
Normal file
10
gcc/testsuite/gcc.c-torture/compile/pr21728.c
Normal file
@ -0,0 +1,10 @@
|
||||
int main (void)
|
||||
{
|
||||
__label__ l1;
|
||||
void __attribute__((used)) q(void)
|
||||
{
|
||||
goto l1;
|
||||
}
|
||||
|
||||
l1:;
|
||||
}
|
@ -1983,11 +1983,23 @@ remove_bb (basic_block bb)
|
||||
{
|
||||
tree stmt = bsi_stmt (i);
|
||||
if (TREE_CODE (stmt) == LABEL_EXPR
|
||||
&& FORCED_LABEL (LABEL_EXPR_LABEL (stmt)))
|
||||
&& (FORCED_LABEL (LABEL_EXPR_LABEL (stmt))
|
||||
|| DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt))))
|
||||
{
|
||||
basic_block new_bb = bb->prev_bb;
|
||||
block_stmt_iterator new_bsi = bsi_start (new_bb);
|
||||
basic_block new_bb;
|
||||
block_stmt_iterator new_bsi;
|
||||
|
||||
/* A non-reachable non-local label may still be referenced.
|
||||
But it no longer needs to carry the extra semantics of
|
||||
non-locality. */
|
||||
if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
|
||||
{
|
||||
DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)) = 0;
|
||||
FORCED_LABEL (LABEL_EXPR_LABEL (stmt)) = 1;
|
||||
}
|
||||
|
||||
new_bb = bb->prev_bb;
|
||||
new_bsi = bsi_start (new_bb);
|
||||
bsi_remove (&i);
|
||||
bsi_insert_before (&new_bsi, stmt, BSI_NEW_STMT);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user