From: Richard Henderson Date: Fri, 5 Aug 2005 23:01:54 +0000 (-0700) Subject: re PR middle-end/21728 (Nonlocal goto from an unused nested function) X-Git-Tag: misc/cutover-cvs2svn~1322 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb1ecfe8a92497f7040e522ffbf0572b00b92492;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95076b929428..3a9b189c9de8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-05 Richard Henderson + + PR 21728 + * tree-cfg.c (remove_bb): Transmute DECL_NONLOCAL labels into + FORCED_LABEL labels. + 2005-08-05 J"orn Rennecke PR middle-end/23135 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21728.c b/gcc/testsuite/gcc.c-torture/compile/pr21728.c new file mode 100644 index 000000000000..991cb3886f85 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr21728.c @@ -0,0 +1,10 @@ +int main (void) +{ + __label__ l1; + void __attribute__((used)) q(void) + { + goto l1; + } + + l1:; +} diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index b5a0696ddecc..70dca21bc83a 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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); }