diff options
author | Per Bothner <per@bothner.com> | 2001-12-09 20:28:28 -0800 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2001-12-09 20:28:28 -0800 |
commit | a5cb134d64a39d1af4c57a863bfe76e1eede38f8 (patch) | |
tree | 73ee10ba948d6110ed04d65fb6a3d591fa635e95 /gcc/java/check-init.c | |
parent | bf6cfc5e9d87d41c96e8c9d65f647a2fb05f842d (diff) | |
download | gcc-a5cb134d64a39d1af4c57a863bfe76e1eede38f8.zip gcc-a5cb134d64a39d1af4c57a863bfe76e1eede38f8.tar.gz gcc-a5cb134d64a39d1af4c57a863bfe76e1eede38f8.tar.bz2 |
check-init.c (current_switch_has_default): New static field.
* check-init.c (current_switch_has_default): New static field.
(check_init): Case DEFAULT_EXPR: Set current_switch_has_default.
Case SWITCH_EXPR: Save/restore current_switch_has_default. If no
DEFAULT_EXPR seen, simulate a default alternative that copies state.
From-SVN: r47833
Diffstat (limited to 'gcc/java/check-init.c')
-rw-r--r-- | gcc/java/check-init.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c index bc73ab2..4b1ab98 100644 --- a/gcc/java/check-init.c +++ b/gcc/java/check-init.c @@ -429,6 +429,9 @@ struct alternatives struct alternatives * alternatives = NULL; +/* True if we've seen a DEFAULT_EXPR for the current SWITCH_EXPR. */ +static int current_switch_has_default; + /* Begin handling a control flow branch. BEFORE is the state of [un]assigned variables on entry. CURRENT is a struct alt to manage the branch alternatives. */ @@ -686,7 +689,9 @@ check_init (exp, before) case SWITCH_EXPR: { struct alternatives alt; + int saved_current_switch_has_default = current_switch_has_default; word buf[2]; + current_switch_has_default = 0; check_init (TREE_OPERAND (exp, 0), before); BEGIN_ALTERNATIVES (before, alt); alt.saved = ALLOC_BUFFER(buf, num_current_words); @@ -694,12 +699,19 @@ check_init (exp, before) alt.block = exp; check_init (TREE_OPERAND (exp, 1), before); done_alternative (before, &alt); + if (! current_switch_has_default) + { + done_alternative (alt.saved, &alt); + } FREE_BUFFER(alt.saved, buf); END_ALTERNATIVES (before, alt); + current_switch_has_default = saved_current_switch_has_default; return; } - case CASE_EXPR: case DEFAULT_EXPR: + current_switch_has_default = 1; + /* .. then fall through ... */ + case CASE_EXPR: { int i; struct alternatives *alt = alternatives; |