summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2017-05-19 08:14:58 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2017-05-19 08:14:58 +0000
commitf150a074f0886c29cb6788b3042cd253097d466e (patch)
tree5d8445fb61849c2f940f435af01f21868311d53d
parent8180194e3b236a00b557d8856eab01edb888a61c (diff)
downloadmpfr-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.c9
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);