tree-cfg.c (tree_verify_flow_info): Make sure that labels in SWITCH_LABELS are always...
authorSteven Bosscher <stevenb@suse.de>
Mon, 7 Jun 2004 06:11:59 +0000 (06:11 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Mon, 7 Jun 2004 06:11:59 +0000 (06:11 +0000)
* tree-cfg.c (tree_verify_flow_info): Make sure that labels in
SWITCH_LABELS are always sorted.

From-SVN: r82683

gcc/ChangeLog
gcc/tree-cfg.c

index 7198e8568f0e53acce4b8074be20098ca6b33d54..2a65c9f19bd7d64dbe8cc157652c226310650108 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-06  Steven Bosscher  <stevenb@suse.de>
+
+       * tree-cfg.c (tree_verify_flow_info): Make sure that labels in
+       SWITCH_LABELS are always sorted.
+
 2004-06-06  Steven Bosscher  <stevenb@suse.de>
 
        * hooks.c (hook_int_void_1): New generic hook.
index d6823cb5216b0bf06496e23c7a556214f18ab9a4..65e8e89ab789d3162d4c7ad64fcd6cc214d2652d 100644 (file)
@@ -3631,6 +3631,7 @@ tree_verify_flow_info (void)
 
        case SWITCH_EXPR:
          {
+           tree prev;
            edge e;
            size_t i, n;
            tree vec;
@@ -3649,6 +3650,34 @@ tree_verify_flow_info (void)
                label_bb->aux = (void *)1;
              }
 
+           /* Verify that the case labels are sorted.  */
+           prev = TREE_VEC_ELT (vec, 0);
+           for (i = 1; i < n - 1; ++i)
+             {
+               tree c = TREE_VEC_ELT (vec, i);
+               if (! CASE_LOW (c))
+                 {
+                   error ("Found default case not at end of case vector");
+                   err = 1;
+                   continue;
+                 }
+               if (! tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
+                 {
+                   error ("Case labels not sorted:\n ");
+                   print_generic_expr (stderr, prev, 0);
+                   fprintf (stderr," is greater than ");
+                   print_generic_expr (stderr, c, 0);
+                   fprintf (stderr," but comes before it.\n");
+                   err = 1;
+                 }
+               prev = c;
+             }
+           if (CASE_LOW (TREE_VEC_ELT (vec, n - 1)))
+             {
+               error ("No default case found at end of case vector");
+               err = 1;
+             }
+
            for (e = bb->succ; e; e = e->succ_next)
              {
                if (!e->dest->aux)