Commit a5cb134d by Per Bothner Committed by Per Bothner

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
parent bf6cfc5e
2001-12-09 Per Bothner <per@bothner.com>
* 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 <tromey@redhat.com> 2001-12-09 Tom Tromey <tromey@redhat.com>
* check-init.c (check_init): Don't allow pre- or post- increment * check-init.c (check_init): Don't allow pre- or post- increment
......
...@@ -429,6 +429,9 @@ struct alternatives ...@@ -429,6 +429,9 @@ struct alternatives
struct alternatives * alternatives = NULL; 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. /* Begin handling a control flow branch.
BEFORE is the state of [un]assigned variables on entry. BEFORE is the state of [un]assigned variables on entry.
CURRENT is a struct alt to manage the branch alternatives. */ CURRENT is a struct alt to manage the branch alternatives. */
...@@ -686,7 +689,9 @@ check_init (exp, before) ...@@ -686,7 +689,9 @@ check_init (exp, before)
case SWITCH_EXPR: case SWITCH_EXPR:
{ {
struct alternatives alt; struct alternatives alt;
int saved_current_switch_has_default = current_switch_has_default;
word buf[2]; word buf[2];
current_switch_has_default = 0;
check_init (TREE_OPERAND (exp, 0), before); check_init (TREE_OPERAND (exp, 0), before);
BEGIN_ALTERNATIVES (before, alt); BEGIN_ALTERNATIVES (before, alt);
alt.saved = ALLOC_BUFFER(buf, num_current_words); alt.saved = ALLOC_BUFFER(buf, num_current_words);
...@@ -694,12 +699,19 @@ check_init (exp, before) ...@@ -694,12 +699,19 @@ check_init (exp, before)
alt.block = exp; alt.block = exp;
check_init (TREE_OPERAND (exp, 1), before); check_init (TREE_OPERAND (exp, 1), before);
done_alternative (before, &alt); done_alternative (before, &alt);
if (! current_switch_has_default)
{
done_alternative (alt.saved, &alt);
}
FREE_BUFFER(alt.saved, buf); FREE_BUFFER(alt.saved, buf);
END_ALTERNATIVES (before, alt); END_ALTERNATIVES (before, alt);
current_switch_has_default = saved_current_switch_has_default;
return; return;
} }
case CASE_EXPR:
case DEFAULT_EXPR: case DEFAULT_EXPR:
current_switch_has_default = 1;
/* .. then fall through ... */
case CASE_EXPR:
{ {
int i; int i;
struct alternatives *alt = alternatives; struct alternatives *alt = alternatives;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment