diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 2002-11-02 21:29:36 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-11-02 21:29:36 +0000 |
commit | fafe87d07d4d685f3c0f6e8d817f0c5ec530abc5 (patch) | |
tree | 9eab0f2c90e0eafd8c918a932688d892ebc2f013 /gcc | |
parent | 77a106a531a92278c5a28b8ec8c373621d302185 (diff) | |
download | gcc-fafe87d07d4d685f3c0f6e8d817f0c5ec530abc5.zip gcc-fafe87d07d4d685f3c0f6e8d817f0c5ec530abc5.tar.gz gcc-fafe87d07d4d685f3c0f6e8d817f0c5ec530abc5.tar.bz2 |
Reverted erroneous checkin
From-SVN: r58756
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/java/decl.c | 10 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 8 | ||||
-rw-r--r-- | gcc/java/lex.c | 65 | ||||
-rw-r--r-- | gcc/java/lex.h | 8 |
5 files changed, 42 insertions, 61 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 5d16f29..678c932 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,15 +1,3 @@ -2002-11-02 Tom Tromey <tromey@redhat.com> - - 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. - 2002-10-24 Tom Tromey <tromey@redhat.com> * gcj.texi (Invoking gij): Document --showversion. diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 172a9fd..4b06aaf 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -1,6 +1,6 @@ /* Process declarations and variables for the GNU compiler for the Java(TM) language. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -454,14 +454,6 @@ java_init_decl_processing () integer_four_node = build_int_2 (4, 0); integer_minus_one_node = build_int_2 (-1, -1); - /* A few values used for range checking in the lexer. */ - decimal_int_max = build_int_2 (0x80000000, 0); - TREE_TYPE (decimal_int_max) = unsigned_int_type_node; - decimal_long_max = (HOST_BITS_PER_WIDE_INT == 32 - ? build_int_2 (0, 0x80000000) - : build_int_2 (0x8000000000000000, 0)); - TREE_TYPE (decimal_long_max) = unsigned_long_type_node; - size_zero_node = size_int (0); size_one_node = size_int (1); bitsize_zero_node = bitsize_int (0); diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index af99ed7..4001bdf 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -275,9 +275,6 @@ enum java_tree_index JTI_UNSIGNED_INT_TYPE_NODE, JTI_UNSIGNED_LONG_TYPE_NODE, - JTI_DECIMAL_INT_MAX_NODE, - JTI_DECIMAL_LONG_MAX_NODE, - JTI_BOOLEAN_TYPE_NODE, JTI_OBJECT_TYPE_NODE, @@ -444,11 +441,6 @@ extern GTY(()) tree java_global_trees[JTI_MAX]; #define unsigned_long_type_node \ java_global_trees[JTI_UNSIGNED_LONG_TYPE_NODE] -#define decimal_int_max \ - java_global_trees[JTI_DECIMAL_INT_MAX_NODE] -#define decimal_long_max \ - java_global_trees[JTI_DECIMAL_LONG_MAX_NODE] - #define boolean_type_node \ java_global_trees[JTI_BOOLEAN_TYPE_NODE] diff --git a/gcc/java/lex.c b/gcc/java/lex.c index 6c7866c..d690176 100644 --- a/gcc/java/lex.c +++ b/gcc/java/lex.c @@ -1218,35 +1218,34 @@ java_lex (java_lval) } /* End borrowed section. */ -#ifndef JC1_LITE /* Range checking. */ - 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))) + if (long_suffix) { - if (long_suffix) + /* 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)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal"); - else + } + 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)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal"); + high = -hb; } - - /* Sign extend the value. */ - SET_LVAL_NODE_TYPE (value, (long_suffix ? long_type_node : int_type_node)); - force_fit_type (value, 0); +#ifndef JC1_LITE + value = build_int_2 (low, high); 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); @@ -1662,14 +1661,24 @@ static void error_if_numeric_overflow (value) tree value; { - if (TREE_CODE (value) == INTEGER_CST - && JAVA_RADIX10_FLAG (value) - && tree_int_cst_sgn (value) < 0) + if (TREE_CODE (value) == INTEGER_CST && JAVA_RADIX10_FLAG (value)) { + 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) - java_lex_error ("Numeric overflow for `long' literal", 0); + { + int hb = (hi >> 31); + if (hb && !(hi & 0x7fffffff)) + java_lex_error ("Numeric overflow for `long' literal", 0); + } else - java_lex_error ("Numeric overflow for `int' literal", 0); + { + int hb = (lo >> 31) & 0x1; + if (hb && !(lo & 0x7fffffff)) + java_lex_error ("Numeric overflow for `int' literal", 0); + } } } #endif /* JC1_LITE */ diff --git a/gcc/java/lex.h b/gcc/java/lex.h index e79d7ee..a458926 100644 --- a/gcc/java/lex.h +++ b/gcc/java/lex.h @@ -1,5 +1,5 @@ /* Language lexer definitions for the GNU compiler for the Java(TM) language. - Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. @@ -185,7 +185,7 @@ extern void java_destroy_lexer PARAMS ((java_lexer *)); #define SET_LVAL_NODE_TYPE(NODE, TYPE) #define BUILD_ID_WFL(EXP) (EXP) #define JAVA_FLOAT_RANGE_ERROR(S) {} -#define JAVA_INTEGRAL_RANGE_ERROR(S) do { } while (0) +#define JAVA_INTEGRAL_RANGE_ERROR(S) {} #else @@ -237,12 +237,12 @@ extern void java_destroy_lexer PARAMS ((java_lexer *)); ctxp->c_line->current = i; \ } #define JAVA_INTEGRAL_RANGE_ERROR(m) \ - do { \ + { \ int i = ctxp->c_line->current; \ ctxp->c_line->current = number_beginning; \ java_lex_error (m, 0); \ ctxp->c_line->current = i; \ - } while (0) + } #endif /* Definitions for jc1 compilation only */ |