aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@gcc.gnu.org>2013-06-24 10:43:55 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2013-06-24 10:43:55 +0200
commit03a8a2d57d28617d60d499a359a60a3258144065 (patch)
treedb39bceb30087cec7331a7840449e4014461dc94 /gcc
parent7ae346c340a76c3bd83db101c72a2deb7a98ea5d (diff)
downloadgcc-03a8a2d57d28617d60d499a359a60a3258144065.zip
gcc-03a8a2d57d28617d60d499a359a60a3258144065.tar.gz
gcc-03a8a2d57d28617d60d499a359a60a3258144065.tar.bz2
[multiple changes]
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-24 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Dominique d'Humieres <dominiq@lps.ens.fr> PR fortran/52413 * gfortran.dg/fraction.f90: New. From-SVN: r200361
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/simplify.c20
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/fraction.f9015
4 files changed, 48 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7667dc2..60097db 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 683d58b..41e1dfb 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -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");
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a58a925..d130644 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..7a98111
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fraction.f90
@@ -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