diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 31fc320856e..bf470d1cbc0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-02-22 Jakub Jelinek + + PR other/5746 + * semantics.c (finish_switch_cond): Don't call get_unwidened + if error_mark_node. + 2002-02-22 Nathan Sidwell PR c++/2645, DR 295 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index c344a3016ef..e77e9299ec1 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -516,7 +516,6 @@ finish_switch_cond (cond, switch_stmt) tree orig_type = NULL; if (!processing_template_decl) { - tree type; tree index; /* Convert the condition to an integer or enumeration type. */ @@ -533,15 +532,17 @@ finish_switch_cond (cond, switch_stmt) cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond)); } - type = TREE_TYPE (cond); - index = get_unwidened (cond, NULL_TREE); - /* We can't strip a conversion from a signed type to an unsigned, - because if we did, int_fits_type_p would do the wrong thing - when checking case values for being in range, - and it's too hard to do the right thing. */ - if (TREE_UNSIGNED (TREE_TYPE (cond)) - == TREE_UNSIGNED (TREE_TYPE (index))) - cond = index; + if (cond != error_mark_node) + { + index = get_unwidened (cond, NULL_TREE); + /* We can't strip a conversion from a signed type to an unsigned, + because if we did, int_fits_type_p would do the wrong thing + when checking case values for being in range, + and it's too hard to do the right thing. */ + if (TREE_UNSIGNED (TREE_TYPE (cond)) + == TREE_UNSIGNED (TREE_TYPE (index))) + cond = index; + } } FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt)); SWITCH_TYPE (switch_stmt) = orig_type;