diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c34e921cb87..319e07efb8c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Dec 12 07:37:52 2001 Olivier Hainque + + * stmt.c (expand_end_case): Do subtraction of lower bound as trees + to avoid overflow. + Wed Dec 12 07:35:24 2001 Douglas B. Rupp * cppfiles.c (read_include_file): Set buffer size properly when diff --git a/gcc/stmt.c b/gcc/stmt.c index 3c4ccd11573..79785540131 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -5525,18 +5525,20 @@ expand_end_case (orig_index) for (n = thiscase->data.case_stmt.case_list; n; n = n->right) { - HOST_WIDE_INT i - = tree_low_cst (n->low, 0) - tree_low_cst (minval, 0); + /* Compute the low and high bounds relative to the minimum + value since that should fit in a HOST_WIDE_INT while the + actual values may not. */ + HOST_WIDE_INT i_low + = tree_low_cst (fold (build (MINUS_EXPR, index_type, + n->low, minval)), 1); + HOST_WIDE_INT i_high + = tree_low_cst (fold (build (MINUS_EXPR, index_type, + n->high, minval)), 1); + HOST_WIDE_INT i; - while (1) - { - labelvec[i] - = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); - if (i + tree_low_cst (minval, 0) - == tree_low_cst (n->high, 0)) - break; - i++; - } + for (i = i_low; i <= i_high; i ++) + labelvec[i] + = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label)); } /* Fill in the gaps with the default. */