diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2013-06-24 10:43:55 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2013-06-24 10:43:55 +0200 |
commit | 03a8a2d57d28617d60d499a359a60a3258144065 (patch) | |
tree | db39bceb30087cec7331a7840449e4014461dc94 /gcc | |
parent | 7ae346c340a76c3bd83db101c72a2deb7a98ea5d (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/fraction.f90 | 15 |
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 |