re PR middle-end/21781 (real.c incorrectly values zero with a large exponent)
authorRoger Sayle <roger@eyesopen.com>
Thu, 16 Mar 2006 16:34:05 +0000 (16:34 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Thu, 16 Mar 2006 16:34:05 +0000 (16:34 +0000)
PR middle-end/21781
* real.c (real_from_string): If the mantissa is zero, don't bother
parsing the exponent as the result should always be zero.

* gcc.dg/real-const-1.c: New test case.

From-SVN: r112136

gcc/ChangeLog
gcc/real.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/real-const-1.c [new file with mode: 0644]

index b7870e32cdd9821cf330a062c4cf565886714326..3dac824d2d9da68ffc8b3590209142d1b50b503e 100644 (file)
@@ -1,3 +1,9 @@
+2006-03-16  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/21781
+       * real.c (real_from_string): If the mantissa is zero, don't bother
+       parsing the exponent as the result should always be zero.
+
 2006-03-16  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * simplify-rtx.c (simplify_plus_minus): Simplify within CONST terms.
index c4b6479067f9081043a7125fed615c37876d9300..1e1083f9abe4d5ba2e02d22f8e683aec9d5e55f7 100644 (file)
@@ -1862,6 +1862,11 @@ real_from_string (REAL_VALUE_TYPE *r, const char *str)
              str++;
            }
        }
+
+      /* If the mantissa is zero, ignore the exponent.  */
+      if (!cmp_significand_0 (r))
+       goto underflow;
+
       if (*str == 'p' || *str == 'P')
        {
          bool exp_neg = false;
@@ -1934,6 +1939,10 @@ real_from_string (REAL_VALUE_TYPE *r, const char *str)
            }
        }
 
+      /* If the mantissa is zero, ignore the exponent.  */
+      if (r->cl == rvc_zero)
+       goto underflow;
+
       if (*str == 'e' || *str == 'E')
        {
          bool exp_neg = false;
index 6b093acf92edbdf450c469436c9dfa57a9ee80ee..90dc7004ae1085e8f6629ee97af489a61f2984ba 100644 (file)
@@ -1,3 +1,8 @@
+2006-03-16  Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/21781
+       * gcc.dg/real-const-1.c: New test case.
+
 2006-03-15  Geoffrey Keating  <geoffk@apple.com>
 
        * g++.old-deja/g++.other/init18.C: New.
diff --git a/gcc/testsuite/gcc.dg/real-const-1.c b/gcc/testsuite/gcc.dg/real-const-1.c
new file mode 100644 (file)
index 0000000..3e2bbfd
--- /dev/null
@@ -0,0 +1,4 @@
+/* PR middle-end/21781.  */
+/* { dg-do compile } */
+
+int f[.0e200000000 == 0?1:-1];