From 0ce17bae34a6c54de31b126f969d3ddd72c6bc37 Mon Sep 17 00:00:00 2001 From: Vincent Lefevre Date: Tue, 22 Nov 2022 16:33:00 +0100 Subject: [PATCH] Fix mpfr_custom_get_kind() macro bug. * src/mpfr.h: in the mpfr_custom_get_kind() macro, changed mpfr_ptr to mpfr_srcptr for _x to agree with the function prototype, in order to avoid a compilation failure of user code in some cases. This bug was introduced by commit 9f94e0311ed53d0c64d4fbca249d19cc4888027e, which introduced the temporary variable _x to avoid an incorrect number of evaluations of the x argument. * tests/tstckintc.c: improved the tests to detect this bug. This should fix mpfr bug #1. Bug initially reported by FX Coudert: https://github.com/CGAL/cgal/issues/7064 It affects Fedora Linux: https://bugzilla.redhat.com/show_bug.cgi?id=2144197 --- src/mpfr.h | 2 +- tests/tstckintc.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) --- a/src/mpfr.h +++ b/src/mpfr.h @@ -1027,7 +1027,7 @@ __MPFR_DECLSPEC int mpfr_total_order_p ( #if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 #define mpfr_custom_get_kind(x) \ __extension__ ({ \ - mpfr_ptr _x = (x); \ + mpfr_srcptr _x = (x); \ _x->_mpfr_exp > __MPFR_EXP_INF ? \ (mpfr_int) MPFR_REGULAR_KIND * MPFR_SIGN (_x) \ : _x->_mpfr_exp == __MPFR_EXP_INF ? \ --- a/tests/tstckintc.c +++ b/tests/tstckintc.c @@ -295,14 +295,16 @@ static void test_nan_inf_zero (void) { mpfr_ptr val; + mpfr_srcptr sval; /* for compilation error checking */ int sign; int kind; reset_stack (); val = new_mpfr (MPFR_PREC_MIN); + sval = val; mpfr_set_nan (val); - kind = (mpfr_custom_get_kind) (val); + kind = (mpfr_custom_get_kind) (sval); if (kind != MPFR_NAN_KIND) { printf ("mpfr_custom_get_kind error: "); @@ -380,7 +382,8 @@ static long * dummy_set_si (long si) { mpfr_t x; - long * r = dummy_new (); + mpfr_srcptr px; /* for compilation error checking */ + long *r = dummy_new (); int i1, i2, i3, i4, i5; /* Check that the type "void *" can be used, like with the function. @@ -405,7 +408,8 @@ dummy_set_si (long si) MPFR_ASSERTN (i5 == 1); mpfr_set_si (x, si, MPFR_RNDN); - r[0] = mpfr_custom_get_kind (x); + px = x; + r[0] = mpfr_custom_get_kind (px); /* Check that the type "void *" can be used in C, like with the function (forbidden in C++). Also check side effects. */