diff options
author | Paul Brook <paul@codesourcery.com> | 2004-08-25 21:04:49 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-08-25 21:04:49 +0000 |
commit | 9ca2b0db5726c53623f356754e5cc46985e7eaf8 (patch) | |
tree | c7fd5e49a0b365b2ea41fa2b7eb91f0548f5ef1c | |
parent | ef79d4c27c8f603530fa8aca47380756c2f9137d (diff) | |
download | gcc-9ca2b0db5726c53623f356754e5cc46985e7eaf8.zip gcc-9ca2b0db5726c53623f356754e5cc46985e7eaf8.tar.gz gcc-9ca2b0db5726c53623f356754e5cc46985e7eaf8.tar.bz2 |
re PR fortran/17190 (MPFR semantics for mpfr_get_z_exp changed)
PR fortran/17190
* arith.c (gfc_mpfr_to_mpz): Workaround mpfr bug.
From-SVN: r86581
-rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/arith.c | 9 |
2 files changed, 11 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 85be102..dd6b48e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,10 @@ 2004-08-25 Paul Brook <paul@codesourcery.com> + PR fortran/17190 + * arith.c (gfc_mpfr_to_mpz): Workaround mpfr bug. + +2004-08-25 Paul Brook <paul@codesourcery.com> + PR fortran/17144 * trans-array.c (gfc_trans_allocate_temp_array): Remove string_length argument. diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index 03ee14c..5f55813 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -106,17 +106,20 @@ int gfc_index_integer_kind; It's easily implemented with a few calls though. */ void -gfc_mpfr_to_mpz(mpz_t z, mpfr_t x) +gfc_mpfr_to_mpz (mpz_t z, mpfr_t x) { mp_exp_t e; e = mpfr_get_z_exp (z, x); + /* MPFR 2.0.1 (included with GMP 4.1) has a bug whereby mpfr_get_z_exp + may set the sign of z incorrectly. Work around that here. */ + if (mpfr_sgn (x) != mpz_sgn (z)) + mpz_neg (z, z); + if (e > 0) mpz_mul_2exp (z, z, e); else mpz_tdiv_q_2exp (z, z, -e); - if (mpfr_sgn (x) < 0) - mpz_neg (z, z); } |