From: Tobias Burnus Date: Mon, 24 Jun 2013 08:43:55 +0000 (+0200) Subject: [multiple changes] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=03a8a2d57d28617d60d499a359a60a3258144065;p=gcc.git [multiple changes] 2013-06-24 Steven G. Kargl Francois-Xavier Coudert Dominique d'Humieres PR fortran/52413 * simplify.c (gfc_simplify_fraction): Fix the sign of negative values. 2013-06-24 Francois-Xavier Coudert Dominique d'Humieres PR fortran/52413 * gfortran.dg/fraction.f90: New. From-SVN: r200361 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7667dc25b67..60097dbe12b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,13 @@ +2013-06-24 Steven G. Kargl + Francois-Xavier Coudert + Dominique d'Humieres + + PR fortran/52413 + * simplify.c (gfc_simplify_fraction): Fix the sign of negative values. + 2013-06-21 Tobias Burnus + 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 683d58b6ee8..41e1dfbe87f 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 a58a9254723..d130644e58a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-06-24 Francois-Xavier Coudert + Dominique d'Humieres + + PR fortran/52413 + * gfortran.dg/fraction.f90: New. + 2013-06-24 Alan Modra * gcc.target/powerpc/altivec-consts.c: Correct for little-endian. @@ -30,6 +36,7 @@ 2013-06-21 Tobias Burnus + PR fortran/37336 * gfortran.dg/finalize_17.f90: New. 2013-06-21 Tobias Burnus diff --git a/gcc/testsuite/gfortran.dg/fraction.f90 b/gcc/testsuite/gfortran.dg/fraction.f90 new file mode 100644 index 00000000000..7a981118e0a --- /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