aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/lex.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2002-11-02 21:26:28 +0000
committerTom Tromey <tromey@gcc.gnu.org>2002-11-02 21:26:28 +0000
commit77a106a531a92278c5a28b8ec8c373621d302185 (patch)
tree964e6dc1d69e5682362f38b13eb1d4903e32a5cd /gcc/java/lex.c
parentbbf6552920d38c1b0c1422d288f395a5323aff28 (diff)
downloadgcc-77a106a531a92278c5a28b8ec8c373621d302185.zip
gcc-77a106a531a92278c5a28b8ec8c373621d302185.tar.gz
gcc-77a106a531a92278c5a28b8ec8c373621d302185.tar.bz2
re PR java/6388 (Integer.MIN_VALUE == 0x80000000 optimized to false on powerpc)
Fix for PR java/6388. * lex.h (JAVA_INTEGRAL_RANGE_ERROR): Wrap in do...while. * java-tree.h (enum java_tree_index): New values JTI_DECIMAL_INT_MAX_NODE, JTI_DECIMAL_LONG_MAX_NODE. (decimal_int_max, decimal_long_max): New defines. * lex.c (yylex): Rewrote range checking. Sign extend literals. (error_if_numeric_overflow): Rewrote range checking. * decl.c (java_init_decl_processing): Initialize decimal_int_max, decimal_long_max. From-SVN: r58755
Diffstat (limited to 'gcc/java/lex.c')
-rw-r--r--gcc/java/lex.c65
1 files changed, 28 insertions, 37 deletions
diff --git a/gcc/java/lex.c b/gcc/java/lex.c
index d690176..6c7866c 100644
--- a/gcc/java/lex.c
+++ b/gcc/java/lex.c
@@ -1218,34 +1218,35 @@ java_lex (java_lval)
}
/* End borrowed section. */
+#ifndef JC1_LITE
/* Range checking. */
- if (long_suffix)
+ value = build_int_2 (low, high);
+ /* Temporarily set type to unsigned. */
+ SET_LVAL_NODE_TYPE (value, (long_suffix
+ ? unsigned_long_type_node
+ : unsigned_int_type_node));
+
+ /* For base 10 numbers, only values up to the highest value
+ (plus one) can be written. For instance, only ints up to
+ 2147483648 can be written. The special case of the largest
+ negative value is handled elsewhere. For other bases, any
+ number can be represented. */
+ if (overflow || (radix == 10
+ && tree_int_cst_lt (long_suffix
+ ? decimal_long_max
+ : decimal_int_max,
+ value)))
{
- /* 9223372036854775808L is valid if operand of a '-'. Otherwise
- 9223372036854775807L is the biggest `long' literal that can be
- expressed using a 10 radix. For other radices, everything that
- fits withing 64 bits is OK. */
- int hb = (high >> 31);
- if (overflow || (hb && low && radix == 10)
- || (hb && high & 0x7fffffff && radix == 10))
+ if (long_suffix)
JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal");
- }
- else
- {
- /* 2147483648 is valid if operand of a '-'. Otherwise,
- 2147483647 is the biggest `int' literal that can be
- expressed using a 10 radix. For other radices, everything
- that fits within 32 bits is OK. As all literals are
- signed, we sign extend here. */
- int hb = (low >> 31) & 0x1;
- if (overflow || high || (hb && low & 0x7fffffff && radix == 10))
+ else
JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal");
- high = -hb;
}
-#ifndef JC1_LITE
- value = build_int_2 (low, high);
+
+ /* Sign extend the value. */
+ SET_LVAL_NODE_TYPE (value, (long_suffix ? long_type_node : int_type_node));
+ force_fit_type (value, 0);
JAVA_RADIX10_FLAG (value) = radix == 10;
- SET_LVAL_NODE_TYPE (value, long_suffix ? long_type_node : int_type_node);
#else
SET_LVAL_NODE_TYPE (build_int_2 (low, high),
long_suffix ? long_type_node : int_type_node);
@@ -1661,24 +1662,14 @@ static void
error_if_numeric_overflow (value)
tree value;
{
- if (TREE_CODE (value) == INTEGER_CST && JAVA_RADIX10_FLAG (value))
+ if (TREE_CODE (value) == INTEGER_CST
+ && JAVA_RADIX10_FLAG (value)
+ && tree_int_cst_sgn (value) < 0)
{
- unsigned HOST_WIDE_INT lo, hi;
-
- lo = TREE_INT_CST_LOW (value);
- hi = TREE_INT_CST_HIGH (value);
if (TREE_TYPE (value) == long_type_node)
- {
- int hb = (hi >> 31);
- if (hb && !(hi & 0x7fffffff))
- java_lex_error ("Numeric overflow for `long' literal", 0);
- }
+ java_lex_error ("Numeric overflow for `long' literal", 0);
else
- {
- int hb = (lo >> 31) & 0x1;
- if (hb && !(lo & 0x7fffffff))
- java_lex_error ("Numeric overflow for `int' literal", 0);
- }
+ java_lex_error ("Numeric overflow for `int' literal", 0);
}
}
#endif /* JC1_LITE */