+Wed Dec 12 07:37:52 2001 Olivier Hainque <hainque@act-europe.fr>
+
+ * 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 <rupp@gnat.com>
* cppfiles.c (read_include_file): Set buffer size properly when
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);
-
- 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++;
- }
+ /* 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;
+
+ 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. */