diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-05-19 08:14:58 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-05-19 08:14:58 +0000 |
commit | f150a074f0886c29cb6788b3042cd253097d466e (patch) | |
tree | 5d8445fb61849c2f940f435af01f21868311d53d | |
parent | 8180194e3b236a00b557d8856eab01edb888a61c (diff) | |
download | mpfr-f150a074f0886c29cb6788b3042cd253097d466e.tar.gz |
fix for clang bug (https://bugs.llvm.org//show_bug.cgi?id=17686)
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@11494 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | src/set_d.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/set_d.c b/src/set_d.c index d8a3091d2..ad046e017 100644 --- a/src/set_d.c +++ b/src/set_d.c @@ -47,6 +47,7 @@ extract_double (mpfr_limb_ptr rp, double d) MPFR_ASSERTD(!DOUBLE_ISINF(d)); MPFR_ASSERTD(d != 0.0); +#undef _MPFR_IEEE_FLOATS #if _MPFR_IEEE_FLOATS { @@ -130,8 +131,16 @@ extract_double (mpfr_limb_ptr rp, double d) d *= MP_BASE_AS_DOUBLE; #if GMP_NUMB_BITS >= 64 +#ifndef __clang__ manl = d; #else + /* clang produces an invalid exception when d >= 2^63, + see https://bugs.llvm.org//show_bug.cgi?id=17686. + Since this is always the case, here, we use the following patch. */ + MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 64); + manl = 0x8000000000000000 + (mp_limb_t) (d - 0x8000000000000000); +#endif /* __clang__ */ +#else MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 32); manh = (mp_limb_t) d; manl = (mp_limb_t) ((d - manh) * MP_BASE_AS_DOUBLE); |