diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 64 |
1 files changed, 8 insertions, 56 deletions
@@ -8569,67 +8569,19 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, abort (); if (SWITCH_LABELS (exp)) { - tree duplicate = 0; tree vec = SWITCH_LABELS (exp); - size_t i, n = TREE_VEC_LENGTH (vec); + size_t i = TREE_VEC_LENGTH (vec); - for (i = 0; i < n; ++i) + do { - tree elt = TREE_VEC_ELT (vec, i); - tree controlling_expr_type = TREE_TYPE (SWITCH_COND (exp)); - tree min_value = TYPE_MIN_VALUE (controlling_expr_type); - tree max_value = TYPE_MAX_VALUE (controlling_expr_type); - - tree case_low = CASE_LOW (elt); - tree case_high = CASE_HIGH (elt) ? CASE_HIGH (elt) : case_low; - if (case_low && case_high) - { - /* Case label is less than minimum for type. */ - if (TREE_CODE (min_value) == INTEGER_CST - && tree_int_cst_compare (case_low, min_value) < 0 - && tree_int_cst_compare (case_high, min_value) < 0) - { - warning ("case label value %d is less than minimum value for type", - TREE_INT_CST (case_low)); - continue; - } - - /* Case value is greater than maximum for type. */ - if (TREE_CODE (max_value) == INTEGER_CST - && tree_int_cst_compare (case_low, max_value) > 0 - && tree_int_cst_compare (case_high, max_value) > 0) - { - warning ("case label value %d exceeds maximum value for type", - TREE_INT_CST (case_high)); - continue; - } - - /* Saturate lower case label value to minimum. */ - if (TREE_CODE (min_value) == INTEGER_CST - && tree_int_cst_compare (case_high, min_value) >= 0 - && tree_int_cst_compare (case_low, min_value) < 0) - { - warning ("lower value %d in case label range less than minimum value for type", - TREE_INT_CST (case_low)); - case_low = min_value; - } - - /* Saturate upper case label value to maximum. */ - if (TREE_CODE (max_value) == INTEGER_CST - && tree_int_cst_compare (case_low, max_value) <= 0 - && tree_int_cst_compare (case_high, max_value) > 0) - { - warning ("upper value %d in case label range exceeds maximum value for type", - TREE_INT_CST (case_high)); - case_high = max_value; - } - } - - add_case_node (case_low, case_high, CASE_LABEL (elt), &duplicate); - if (duplicate) - abort (); + tree elt = TREE_VEC_ELT (vec, --i); + add_case_node (CASE_LOW (elt), CASE_HIGH (elt), + CASE_LABEL (elt)); } + while (i); } + else + abort (); expand_end_case_type (SWITCH_COND (exp), TREE_TYPE (exp)); return const0_rtx; |