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:
Richard Henderson 2005-08-05 16:01:54 -07:00 committed by Richard Henderson
parent 0e44ef6254
commit bb1ecfe8a9
3 changed files with 31 additions and 3 deletions

View File

@ -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

View File

@ -0,0 +1,10 @@
int main (void)
{
__label__ l1;
void __attribute__((used)) q(void)
{
goto l1;
}
l1:;
}

View File

@ -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);
}