diff -Naurd mpfr-3.1.2-a/PATCHES mpfr-3.1.2-b/PATCHES --- mpfr-3.1.2-a/PATCHES 2013-10-09 13:34:21.000000000 +0000 +++ mpfr-3.1.2-b/PATCHES 2013-10-09 13:34:21.000000000 +0000 @@ -0,0 +1 @@ +clang-divby0 diff -Naurd mpfr-3.1.2-a/VERSION mpfr-3.1.2-b/VERSION --- mpfr-3.1.2-a/VERSION 2013-09-26 10:52:52.000000000 +0000 +++ mpfr-3.1.2-b/VERSION 2013-10-09 13:34:21.000000000 +0000 @@ -1 +1 @@ -3.1.2-p2 +3.1.2-p3 diff -Naurd mpfr-3.1.2-a/src/mpfr-impl.h mpfr-3.1.2-b/src/mpfr-impl.h --- mpfr-3.1.2-a/src/mpfr-impl.h 2013-03-13 15:37:36.000000000 +0000 +++ mpfr-3.1.2-b/src/mpfr-impl.h 2013-10-09 13:34:21.000000000 +0000 @@ -468,8 +468,16 @@ #define MPFR_LIMBS_PER_FLT ((IEEE_FLT_MANT_DIG-1)/GMP_NUMB_BITS+1) /* Visual C++ doesn't support +1.0/0.0, -1.0/0.0 and 0.0/0.0 - at compile time. */ -#if defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200) + at compile time. + Clang with -fsanitize=undefined is a bit similar due to a bug: + http://llvm.org/bugs/show_bug.cgi?id=17381 + but even without its sanitizer, it may be better to use the + double_zero version until IEEE 754 division by zero is properly + supported: + http://llvm.org/bugs/show_bug.cgi?id=17000 +*/ +#if (defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200)) || \ + defined(__clang__) static double double_zero = 0.0; # define DBL_NAN (double_zero/double_zero) # define DBL_POS_INF ((double) 1.0/double_zero) @@ -501,6 +509,8 @@ (with Xcode 2.4.1, i.e. the latest one). */ #define LVALUE(x) (&(x) == &(x) || &(x) != &(x)) #define DOUBLE_ISINF(x) (LVALUE(x) && ((x) > DBL_MAX || (x) < -DBL_MAX)) +/* The DOUBLE_ISNAN(x) macro is also valid on long double x + (assuming that the compiler isn't too broken). */ #ifdef MPFR_NANISNAN /* Avoid MIPSpro / IRIX64 / gcc -ffast-math (incorrect) optimizations. The + must not be replaced by a ||. With gcc -ffast-math, NaN is diff -Naurd mpfr-3.1.2-a/src/mpfr.h mpfr-3.1.2-b/src/mpfr.h --- mpfr-3.1.2-a/src/mpfr.h 2013-09-26 10:52:52.000000000 +0000 +++ mpfr-3.1.2-b/src/mpfr.h 2013-10-09 13:34:21.000000000 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 3 #define MPFR_VERSION_MINOR 1 #define MPFR_VERSION_PATCHLEVEL 2 -#define MPFR_VERSION_STRING "3.1.2-p2" +#define MPFR_VERSION_STRING "3.1.2-p3" /* Macros dealing with MPFR VERSION */ #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) diff -Naurd mpfr-3.1.2-a/src/version.c mpfr-3.1.2-b/src/version.c --- mpfr-3.1.2-a/src/version.c 2013-09-26 10:52:52.000000000 +0000 +++ mpfr-3.1.2-b/src/version.c 2013-10-09 13:34:21.000000000 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "3.1.2-p2"; + return "3.1.2-p3"; } diff -Naurd mpfr-3.1.2-a/tests/tget_flt.c mpfr-3.1.2-b/tests/tget_flt.c --- mpfr-3.1.2-a/tests/tget_flt.c 2013-03-13 15:37:44.000000000 +0000 +++ mpfr-3.1.2-b/tests/tget_flt.c 2013-10-09 13:34:21.000000000 +0000 @@ -28,9 +28,17 @@ main (void) { mpfr_t x, y; - float f, g, infp; + float f, g; int i; +#if !defined(MPFR_ERRDIVZERO) + float infp; +#endif + + tests_start_mpfr (); +#if !defined(MPFR_ERRDIVZERO) + /* The definition of DBL_POS_INF involves a division by 0. This makes + "clang -O2 -fsanitize=undefined -fno-sanitize-recover" fail. */ infp = (float) DBL_POS_INF; if (infp * 0.5 != infp) { @@ -38,8 +46,7 @@ fprintf (stderr, "(this is probably a compiler bug, please report)\n"); exit (1); } - - tests_start_mpfr (); +#endif mpfr_init2 (x, 24); mpfr_init2 (y, 24); @@ -353,6 +360,7 @@ printf ("expected %.8e, got %.8e\n", g, f); exit (1); } +#if !defined(MPFR_ERRDIVZERO) f = mpfr_get_flt (x, MPFR_RNDN); /* first round to 2^128 (even rule), thus we should get +Inf */ g = infp; @@ -376,6 +384,7 @@ printf ("expected %.8e, got %.8e\n", g, f); exit (1); } +#endif mpfr_clear (x); mpfr_clear (y); diff -Naurd mpfr-3.1.2-a/tests/tset_ld.c mpfr-3.1.2-b/tests/tset_ld.c --- mpfr-3.1.2-a/tests/tset_ld.c 2013-03-13 15:37:44.000000000 +0000 +++ mpfr-3.1.2-b/tests/tset_ld.c 2013-10-09 13:34:21.000000000 +0000 @@ -47,8 +47,11 @@ static int Isnan_ld (long double d) { - double e = (double) d; - if (DOUBLE_ISNAN (e)) + /* Do not convert d to double as this can give an overflow, which + may confuse compilers without IEEE 754 support (such as clang + -fsanitize=undefined), or trigger a trap if enabled. + The DOUBLE_ISNAN macro should work fine on long double. */ + if (DOUBLE_ISNAN (d)) return 1; LONGDOUBLE_NAN_ACTION (d, goto yes); return 0;