check-init.c (current_switch_has_default): New static field.
authorPer Bothner <per@bothner.com>
Mon, 10 Dec 2001 04:28:28 +0000 (20:28 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Mon, 10 Dec 2001 04:28:28 +0000 (20:28 -0800)
* 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
gcc/java/check-init.c

index aa5a8dfa2b11b6974d122dc81817689765909773..07bf935f635b24befb17a306ef58eeddc99e5f87 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        * check-init.c (check_init): Don't allow pre- or post- increment
index bc73ab2a05b8bc1ca00aa9fe2cf334f335748edc..4b1ab98b0e8ce04df3d6d44d92b2c1d18297fbc7 100644 (file)
@@ -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;