From 913746e3284267294197f2b41df8d5f67f9398a6 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 20 Dec 2002 19:25:46 +0000 Subject: re PR java/8955 (switch case statement causes gcj to throw segmentation fault) * jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case where minimum case value is Integer.MIN_VALUE. Fixes PR java/8955. From-SVN: r60372 --- gcc/java/jcf-write.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'gcc/java/jcf-write.c') diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index bfb1bd2..866ba7d 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -1746,6 +1746,7 @@ generate_bytecode_insns (exp, target, state) else { HOST_WIDE_INT i; + unsigned HOST_WIDE_INT delta; /* Copy the chain of relocs into a sorted array. */ struct jcf_relocation **relocs = (struct jcf_relocation **) xmalloc (sw_state.num_cases * sizeof (struct jcf_relocation *)); @@ -1778,8 +1779,11 @@ generate_bytecode_insns (exp, target, state) handled by the parser. */ } - if (2 * sw_state.num_cases - >= sw_state.max_case - sw_state.min_case) + /* We could have DELTA < 0 if sw_state.min_case is + something like Integer.MIN_VALUE. That is why delta is + unsigned. */ + delta = sw_state.max_case - sw_state.min_case; + if (2 * sw_state.num_cases >= delta) { /* Use tableswitch. */ int index = 0; RESERVE (13 + 4 * (sw_state.max_case - sw_state.min_case + 1)); -- cgit v1.1