Blame SOURCES/gcc32-java-intlex.patch

6f1b0c
2002-11-05  Tom Tromey  <tromey@redhat.com>
6f1b0c
6f1b0c
	Fix for PR java/6388.
6f1b0c
	* lex.h (JAVA_INTEGRAL_RANGE_ERROR): Wrap in do...while.
6f1b0c
	* java-tree.h (enum java_tree_index): New values
6f1b0c
	JTI_DECIMAL_INT_MAX_NODE, JTI_DECIMAL_LONG_MAX_NODE.
6f1b0c
	(decimal_int_max, decimal_long_max): New defines.
6f1b0c
	* lex.c (yylex): Rewrote range checking.  Sign extend literals.
6f1b0c
	(error_if_numeric_overflow): Rewrote range checking.
6f1b0c
	* decl.c (java_init_decl_processing): Initialize decimal_int_max,
6f1b0c
	decimal_long_max.
6f1b0c
6f1b0c
--- gcc/java/decl.c	2 Nov 2002 21:29:36 -0000	1.134
6f1b0c
+++ gcc/java/decl.c	6 Nov 2002 00:01:00 -0000	1.135
6f1b0c
@@ -454,6 +454,20 @@ java_init_decl_processing ()
6f1b0c
   integer_four_node = build_int_2 (4, 0);
6f1b0c
   integer_minus_one_node = build_int_2 (-1, -1);
6f1b0c
 
6f1b0c
+  /* A few values used for range checking in the lexer.  */
6f1b0c
+  decimal_int_max = build_int_2 (0x80000000, 0);
6f1b0c
+  TREE_TYPE (decimal_int_max) = unsigned_int_type_node;
6f1b0c
+#if HOST_BITS_PER_WIDE_INT == 64
6f1b0c
+  decimal_long_max = build_int_2 (0x8000000000000000, 0);
6f1b0c
+#else
6f1b0c
+#if HOST_BITS_PER_WIDE_INT == 32
6f1b0c
+  decimal_long_max = build_int_2 (0, 0x80000000);
6f1b0c
+#else
6f1b0c
+ #error "unsupported size"
6f1b0c
+#endif
6f1b0c
+#endif
6f1b0c
+  TREE_TYPE (decimal_long_max) = unsigned_long_type_node;
6f1b0c
+
6f1b0c
   size_zero_node = size_int (0);
6f1b0c
   size_one_node = size_int (1);
6f1b0c
   bitsize_zero_node = bitsize_int (0);
6f1b0c
--- gcc/java/java-tree.h	2 Nov 2002 23:52:26 -0000	1.161
6f1b0c
+++ gcc/java/java-tree.h	6 Nov 2002 00:01:00 -0000	1.162
6f1b0c
@@ -275,6 +275,9 @@ enum java_tree_index
6f1b0c
   JTI_UNSIGNED_INT_TYPE_NODE,
6f1b0c
   JTI_UNSIGNED_LONG_TYPE_NODE,
6f1b0c
   
6f1b0c
+  JTI_DECIMAL_INT_MAX_NODE,
6f1b0c
+  JTI_DECIMAL_LONG_MAX_NODE,
6f1b0c
+
6f1b0c
   JTI_BOOLEAN_TYPE_NODE,
6f1b0c
 
6f1b0c
   JTI_OBJECT_TYPE_NODE,
6f1b0c
@@ -441,6 +444,11 @@ extern GTY(()) tree java_global_trees[JT
6f1b0c
 #define unsigned_long_type_node \
6f1b0c
   java_global_trees[JTI_UNSIGNED_LONG_TYPE_NODE]
6f1b0c
 
6f1b0c
+#define decimal_int_max \
6f1b0c
+  java_global_trees[JTI_DECIMAL_INT_MAX_NODE]
6f1b0c
+#define decimal_long_max \
6f1b0c
+  java_global_trees[JTI_DECIMAL_LONG_MAX_NODE]
6f1b0c
+
6f1b0c
 #define boolean_type_node \
6f1b0c
   java_global_trees[JTI_BOOLEAN_TYPE_NODE]
6f1b0c
 
6f1b0c
--- gcc/java/lex.c	2 Nov 2002 21:29:36 -0000	1.94
6f1b0c
+++ gcc/java/lex.c	6 Nov 2002 00:01:01 -0000	1.95
6f1b0c
@@ -1218,34 +1218,35 @@ java_lex (java_lval)
6f1b0c
 	}
6f1b0c
       /* End borrowed section.  */
6f1b0c
 
6f1b0c
+#ifndef JC1_LITE
6f1b0c
       /* Range checking.  */
6f1b0c
-      if (long_suffix)
6f1b0c
+      value = build_int_2 (low, high);
6f1b0c
+      /* Temporarily set type to unsigned.  */
6f1b0c
+      SET_LVAL_NODE_TYPE (value, (long_suffix
6f1b0c
+				  ? unsigned_long_type_node
6f1b0c
+				  : unsigned_int_type_node));
6f1b0c
+
6f1b0c
+      /* For base 10 numbers, only values up to the highest value
6f1b0c
+	 (plus one) can be written.  For instance, only ints up to
6f1b0c
+	 2147483648 can be written.  The special case of the largest
6f1b0c
+	 negative value is handled elsewhere.  For other bases, any
6f1b0c
+	 number can be represented.  */
6f1b0c
+      if (overflow || (radix == 10
6f1b0c
+		       && tree_int_cst_lt (long_suffix
6f1b0c
+					   ? decimal_long_max
6f1b0c
+					   : decimal_int_max,
6f1b0c
+					   value)))
6f1b0c
 	{
6f1b0c
-	  /* 9223372036854775808L is valid if operand of a '-'. Otherwise
6f1b0c
-	     9223372036854775807L is the biggest `long' literal that can be
6f1b0c
-	     expressed using a 10 radix. For other radices, everything that
6f1b0c
-	     fits withing 64 bits is OK.  */
6f1b0c
-	  int hb = (high >> 31);
6f1b0c
-	  if (overflow || (hb && low && radix == 10)
6f1b0c
-	      || (hb && high & 0x7fffffff && radix == 10))
6f1b0c
+	  if (long_suffix)
6f1b0c
 	    JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal");
6f1b0c
-	}
6f1b0c
-      else
6f1b0c
-	{
6f1b0c
-	  /* 2147483648 is valid if operand of a '-'. Otherwise,
6f1b0c
-	     2147483647 is the biggest `int' literal that can be
6f1b0c
-	     expressed using a 10 radix. For other radices, everything
6f1b0c
-	     that fits within 32 bits is OK.  As all literals are
6f1b0c
-	     signed, we sign extend here.  */
6f1b0c
-	  int hb = (low >> 31) & 0x1;
6f1b0c
-	  if (overflow || high || (hb && low & 0x7fffffff && radix == 10))
6f1b0c
+	  else
6f1b0c
 	    JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal");
6f1b0c
-	  high = -hb;
6f1b0c
 	}
6f1b0c
-#ifndef JC1_LITE
6f1b0c
-      value = build_int_2 (low, high);
6f1b0c
+
6f1b0c
+      /* Sign extend the value.  */
6f1b0c
+      SET_LVAL_NODE_TYPE (value, (long_suffix ? long_type_node : int_type_node));
6f1b0c
+      force_fit_type (value, 0);
6f1b0c
       JAVA_RADIX10_FLAG (value) = radix == 10;
6f1b0c
-      SET_LVAL_NODE_TYPE (value, long_suffix ? long_type_node : int_type_node);
6f1b0c
 #else
6f1b0c
       SET_LVAL_NODE_TYPE (build_int_2 (low, high),
6f1b0c
 			  long_suffix ? long_type_node : int_type_node);
6f1b0c
@@ -1661,24 +1662,14 @@ static void
6f1b0c
 error_if_numeric_overflow (value)
6f1b0c
      tree value;
6f1b0c
 {
6f1b0c
-  if (TREE_CODE (value) == INTEGER_CST && JAVA_RADIX10_FLAG (value))
6f1b0c
+  if (TREE_CODE (value) == INTEGER_CST
6f1b0c
+      && JAVA_RADIX10_FLAG (value)
6f1b0c
+      && tree_int_cst_sgn (value) < 0)
6f1b0c
     {
6f1b0c
-      unsigned HOST_WIDE_INT lo, hi;
6f1b0c
-
6f1b0c
-      lo = TREE_INT_CST_LOW (value);
6f1b0c
-      hi = TREE_INT_CST_HIGH (value);
6f1b0c
       if (TREE_TYPE (value) == long_type_node)
6f1b0c
-	{
6f1b0c
-	  int hb = (hi >> 31);
6f1b0c
-	  if (hb && !(hi & 0x7fffffff))
6f1b0c
-	    java_lex_error ("Numeric overflow for `long' literal", 0);
6f1b0c
-	}
6f1b0c
+	java_lex_error ("Numeric overflow for `long' literal", 0);
6f1b0c
       else
6f1b0c
-	{
6f1b0c
-	  int hb = (lo >> 31) & 0x1;
6f1b0c
-	  if (hb && !(lo & 0x7fffffff))
6f1b0c
-	    java_lex_error ("Numeric overflow for `int' literal", 0);
6f1b0c
-	}
6f1b0c
+	java_lex_error ("Numeric overflow for `int' literal", 0);
6f1b0c
     }
6f1b0c
 }
6f1b0c
 #endif /* JC1_LITE */
6f1b0c
--- gcc/java/lex.h	2 Nov 2002 21:29:36 -0000	1.28
6f1b0c
+++ gcc/java/lex.h	6 Nov 2002 00:01:01 -0000	1.29
6f1b0c
@@ -185,7 +185,7 @@ extern void java_destroy_lexer PARAMS ((
6f1b0c
 #define SET_LVAL_NODE_TYPE(NODE, TYPE)
6f1b0c
 #define BUILD_ID_WFL(EXP) (EXP)
6f1b0c
 #define JAVA_FLOAT_RANGE_ERROR(S) {}
6f1b0c
-#define JAVA_INTEGRAL_RANGE_ERROR(S) {}
6f1b0c
+#define JAVA_INTEGRAL_RANGE_ERROR(S) do { } while (0)
6f1b0c
 
6f1b0c
 #else
6f1b0c
 
6f1b0c
@@ -237,12 +237,12 @@ extern void java_destroy_lexer PARAMS ((
6f1b0c
     ctxp->c_line->current = i;						  \
6f1b0c
   }
6f1b0c
 #define JAVA_INTEGRAL_RANGE_ERROR(m)		\
6f1b0c
-  {						\
6f1b0c
+  do {						\
6f1b0c
     int i = ctxp->c_line->current;		\
6f1b0c
     ctxp->c_line->current = number_beginning;	\
6f1b0c
     java_lex_error (m, 0);			\
6f1b0c
     ctxp->c_line->current = i;			\
6f1b0c
-  }
6f1b0c
+  } while (0)
6f1b0c
 
6f1b0c
 #endif /* Definitions for jc1 compilation only */
6f1b0c