diff options
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index d6823cb..65e8e89ab 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -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) |