From a5cb134d64a39d1af4c57a863bfe76e1eede38f8 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Sun, 9 Dec 2001 20:28:28 -0800 Subject: [PATCH] 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 --- gcc/java/ChangeLog | 7 +++++++ gcc/java/check-init.c | 14 +++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index aa5a8dfa2b1..07bf935f635 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,10 @@ +2001-12-09 Per Bothner + + * 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. + 2001-12-09 Tom Tromey * check-init.c (check_init): Don't allow pre- or post- increment diff --git a/gcc/java/check-init.c b/gcc/java/check-init.c index bc73ab2a05b..4b1ab98b0e8 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; -- 2.30.2