re PR middle-end/18859 (ACATS ICE c37305a at -O0: in tree_low_cst, at tree.c:3839)

PR middle-end/18859
	* gimplify.c (gimplify_switch_expr): Discard empty ranges.
	* stmt.c (expand_case): Likewise.

From-SVN: r112000
This commit is contained in:
Eric Botcazou 2006-03-13 14:18:24 +00:00 committed by Eric Botcazou
parent ba9462095c
commit 3feaea007d
5 changed files with 70 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2006-03-13 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/18859
* gimplify.c (gimplify_switch_expr): Discard empty ranges.
* stmt.c (expand_case): Likewise.
2006-03-13 Zdenek Dvorak <dvorakz@suse.cz>
PR rtl-optimization/26254

View File

@ -1327,20 +1327,34 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p)
labels = gimplify_ctxp->case_labels;
gimplify_ctxp->case_labels = saved_labels;
len = VEC_length (tree, labels);
for (i = 0; i < len; ++i)
i = 0;
while (i < VEC_length (tree, labels))
{
tree t = VEC_index (tree, labels, i);
if (!CASE_LOW (t))
tree elt = VEC_index (tree, labels, i);
tree low = CASE_LOW (elt);
bool remove_element = FALSE;
if (low)
{
/* Discard empty ranges. */
tree high = CASE_HIGH (elt);
if (high && INT_CST_LT (high, low))
remove_element = TRUE;
}
else
{
/* The default case must be the last label in the list. */
default_case = t;
VEC_replace (tree, labels, i, VEC_index (tree, labels, len - 1));
len--;
break;
gcc_assert (!default_case);
default_case = elt;
remove_element = TRUE;
}
if (remove_element)
VEC_ordered_remove (tree, labels, i);
else
i++;
}
len = i;
label_vec = make_tree_vec (len + 1);
SWITCH_LABELS (*expr_p) = label_vec;

View File

@ -2286,7 +2286,7 @@ emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
#define HAVE_tablejump 0
#endif
/* Terminate a case (Pascal) or switch (C) statement
/* Terminate a case (Pascal/Ada) or switch (C) statement
in which ORIG_INDEX is the expression to be tested.
If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
type as given in the source before any compiler conversions.
@ -2348,10 +2348,18 @@ expand_case (tree exp)
for (i = TREE_VEC_LENGTH (vec) - 1; --i >= 0; )
{
tree low, high;
elt = TREE_VEC_ELT (vec, i);
gcc_assert (CASE_LOW (elt));
case_list = add_case_node (case_list, index_type,
CASE_LOW (elt), CASE_HIGH (elt),
low = CASE_LOW (elt);
gcc_assert (low);
high = CASE_HIGH (elt);
/* Discard empty ranges. */
if (high && INT_CST_LT (high, low))
continue;
case_list = add_case_node (case_list, index_type, low, high,
CASE_LABEL (elt));
}

View File

@ -1,3 +1,7 @@
2006-03-13 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/switch-9.c: New test.
2006-03-13 Richard Guenther <rguenther@suse.de>
PR middle-end/26630

View File

@ -0,0 +1,25 @@
/* PR middle-end/18859 */
/* { dg-do compile } */
/* { dg-options "" } */
void foo(int a)
{
switch (a)
{
case 0 ... -1: /* { dg-warning "empty range" } */
a = a+2;
break;
case 1 ... 2:
a = 0;
break;
case 3 ... 4:
a = 1;
break;
case 5 ... 6:
a = 0;
break;
}
}