2013-06-24 Steven G. Kargl <sgk@troutmask.apl.washington.edu>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jun 2013 08:43:55 +0000 (08:43 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jun 2013 08:43:55 +0000 (08:43 +0000)
            Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Dominique d'Humieres  <dominiq@lps.ens.fr>

        PR fortran/52413
        * simplify.c (gfc_simplify_fraction): Fix the sign of negative values.

2013-06-24  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
            Dominique d'Humieres  <dominiq@lps.ens.fr>

        PR fortran/52413
        * gfortran.dg/fraction.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@200361 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/fraction.f90 [new file with mode: 0644]

index 7667dc2..60097db 100644 (file)
@@ -1,5 +1,13 @@
+2013-06-24  Steven G. Kargl  <sgk@troutmask.apl.washington.edu>
+           Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+           Dominique d'Humieres  <dominiq@lps.ens.fr>
+
+       PR fortran/52413
+       * simplify.c (gfc_simplify_fraction): Fix the sign of negative values.
+
 2013-06-21  Tobias Burnus  <burnus@net-b.de>
 
+       PR fortran/37336
        * trans-array.c (gfc_trans_deferred_array): Call the
        finalizer for nonallocatable local variables.
        * trans-decl.c (gfc_get_symbol_decl): Add local
index 683d58b..41e1dfb 100644 (file)
@@ -2342,16 +2342,26 @@ gfc_expr *
 gfc_simplify_fraction (gfc_expr *x)
 {
   gfc_expr *result;
+
+#if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
   mpfr_t absv, exp, pow2;
+#else
+  mpfr_exp_t e;
+#endif
 
   if (x->expr_type != EXPR_CONSTANT)
     return NULL;
 
   result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
 
+#if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
+
+  /* MPFR versions before 3.1.0 do not include mpfr_frexp.  
+     TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
+
   if (mpfr_sgn (x->value.real) == 0)
     {
-      mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
+      mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
       return result;
     }
 
@@ -2368,10 +2378,16 @@ gfc_simplify_fraction (gfc_expr *x)
 
   mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
 
-  mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
+  mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
 
   mpfr_clears (exp, absv, pow2, NULL);
 
+#else
+
+  mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
+
+#endif
+
   return range_check (result, "FRACTION");
 }
 
index a58a925..d130644 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-24  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+           Dominique d'Humieres  <dominiq@lps.ens.fr>
+
+       PR fortran/52413
+       * gfortran.dg/fraction.f90: New.
+
 2013-06-24  Alan Modra  <amodra@gmail.com>
 
        * gcc.target/powerpc/altivec-consts.c: Correct for little-endian.
@@ -30,6 +36,7 @@
 
 2013-06-21  Tobias Burnus  <burnus@net-b.de>
 
+       PR fortran/37336
        * gfortran.dg/finalize_17.f90: New.
 
 2013-06-21  Tobias Burnus  <burnus@net-b.de>
diff --git a/gcc/testsuite/gfortran.dg/fraction.f90 b/gcc/testsuite/gfortran.dg/fraction.f90
new file mode 100644 (file)
index 0000000..7a98111
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do run }
+!
+! Test for pr52413
+!
+
+program test_frac
+
+  real :: y
+  y=fraction (-2.0) 
+  if (fraction (-2.0) /= -0.5) call abort ()
+  if (fraction (-0.0) /= 0.0) call abort ()
+  if (sign(1.0, fraction(-0.0)) /= -1.0) call abort ()
+  if (fraction (-2.0_8) /=  -0.5) call abort ()
+
+end program test_frac