Commit 3feaea00 by Eric Botcazou Committed by Eric Botcazou

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
parent ba946209
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> 2006-03-13 Zdenek Dvorak <dvorakz@suse.cz>
PR rtl-optimization/26254 PR rtl-optimization/26254
......
...@@ -1327,20 +1327,34 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p) ...@@ -1327,20 +1327,34 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p)
labels = gimplify_ctxp->case_labels; labels = gimplify_ctxp->case_labels;
gimplify_ctxp->case_labels = saved_labels; gimplify_ctxp->case_labels = saved_labels;
len = VEC_length (tree, labels); i = 0;
while (i < VEC_length (tree, labels))
for (i = 0; i < len; ++i)
{ {
tree t = VEC_index (tree, labels, i); tree elt = VEC_index (tree, labels, i);
if (!CASE_LOW (t)) 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. */ /* The default case must be the last label in the list. */
default_case = t; gcc_assert (!default_case);
VEC_replace (tree, labels, i, VEC_index (tree, labels, len - 1)); default_case = elt;
len--; remove_element = TRUE;
break;
} }
if (remove_element)
VEC_ordered_remove (tree, labels, i);
else
i++;
} }
len = i;
label_vec = make_tree_vec (len + 1); label_vec = make_tree_vec (len + 1);
SWITCH_LABELS (*expr_p) = label_vec; SWITCH_LABELS (*expr_p) = label_vec;
......
...@@ -2286,7 +2286,7 @@ emit_case_bit_tests (tree index_type, tree index_expr, tree minval, ...@@ -2286,7 +2286,7 @@ emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
#define HAVE_tablejump 0 #define HAVE_tablejump 0
#endif #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. in which ORIG_INDEX is the expression to be tested.
If ORIG_TYPE is not NULL, it is the original ORIG_INDEX If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
type as given in the source before any compiler conversions. type as given in the source before any compiler conversions.
...@@ -2348,10 +2348,18 @@ expand_case (tree exp) ...@@ -2348,10 +2348,18 @@ expand_case (tree exp)
for (i = TREE_VEC_LENGTH (vec) - 1; --i >= 0; ) for (i = TREE_VEC_LENGTH (vec) - 1; --i >= 0; )
{ {
tree low, high;
elt = TREE_VEC_ELT (vec, i); elt = TREE_VEC_ELT (vec, i);
gcc_assert (CASE_LOW (elt));
case_list = add_case_node (case_list, index_type, low = CASE_LOW (elt);
CASE_LOW (elt), CASE_HIGH (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)); CASE_LABEL (elt));
} }
......
2006-03-13 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/switch-9.c: New test.
2006-03-13 Richard Guenther <rguenther@suse.de> 2006-03-13 Richard Guenther <rguenther@suse.de>
PR middle-end/26630 PR middle-end/26630
/* 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;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment