Commit 03a8a2d5 by Tobias Burnus

[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
parent 7ae346c3
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> 2013-06-21 Tobias Burnus <burnus@net-b.de>
PR fortran/37336
* trans-array.c (gfc_trans_deferred_array): Call the * trans-array.c (gfc_trans_deferred_array): Call the
finalizer for nonallocatable local variables. finalizer for nonallocatable local variables.
* trans-decl.c (gfc_get_symbol_decl): Add local * trans-decl.c (gfc_get_symbol_decl): Add local
......
...@@ -2342,16 +2342,26 @@ gfc_expr * ...@@ -2342,16 +2342,26 @@ gfc_expr *
gfc_simplify_fraction (gfc_expr *x) gfc_simplify_fraction (gfc_expr *x)
{ {
gfc_expr *result; gfc_expr *result;
#if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
mpfr_t absv, exp, pow2; mpfr_t absv, exp, pow2;
#else
mpfr_exp_t e;
#endif
if (x->expr_type != EXPR_CONSTANT) if (x->expr_type != EXPR_CONSTANT)
return NULL; return NULL;
result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 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) 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; return result;
} }
...@@ -2368,10 +2378,16 @@ gfc_simplify_fraction (gfc_expr *x) ...@@ -2368,10 +2378,16 @@ gfc_simplify_fraction (gfc_expr *x)
mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE); 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); 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"); return range_check (result, "FRACTION");
} }
......
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> 2013-06-24 Alan Modra <amodra@gmail.com>
* gcc.target/powerpc/altivec-consts.c: Correct for little-endian. * gcc.target/powerpc/altivec-consts.c: Correct for little-endian.
...@@ -30,6 +36,7 @@ ...@@ -30,6 +36,7 @@
2013-06-21 Tobias Burnus <burnus@net-b.de> 2013-06-21 Tobias Burnus <burnus@net-b.de>
PR fortran/37336
* gfortran.dg/finalize_17.f90: New. * gfortran.dg/finalize_17.f90: New.
2013-06-21 Tobias Burnus <burnus@net-b.de> 2013-06-21 Tobias Burnus <burnus@net-b.de>
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment