diff -Naurd mpfr-2.2.0-p1/mpfr.h mpfr-2.2.0-p2/mpfr.h --- mpfr-2.2.0-p1/mpfr.h 2005-09-06 15:02:12.000000000 +0000 +++ mpfr-2.2.0-p2/mpfr.h 2005-09-29 11:36:36.000000000 +0000 @@ -630,12 +630,17 @@ (__builtin_constant_p (_s) && (_s) >= 0 ? \ mpfr_cmp_ui ((_f), (_s)) : \ mpfr_cmp_si_2exp ((_f), (_s), 0)) +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 #undef mpfr_set_ui #define mpfr_set_ui(_f,_u,_r) \ (__builtin_constant_p (_u) && (_u) == 0 ? \ - ((_f)->_mpfr_sign = 1, \ - (_f)->_mpfr_exp = __MPFR_EXP_ZERO, 0): \ - mpfr_set_ui (_f,_u,_r)) + __extension__ ({ \ + mpfr_ptr _p = (_f); \ + _p->_mpfr_sign = 1; \ + _p->_mpfr_exp = __MPFR_EXP_ZERO; \ + (void) (_r); 0; }) : \ + mpfr_set_ui (_f,_u,_r)) +#endif #undef mpfr_set_si #define mpfr_set_si(_f,_s,_r) \ (__builtin_constant_p (_s) && (_s) >= 0 ? \ diff -Naurd mpfr-2.2.0-p1/tests/tset_si.c mpfr-2.2.0-p2/tests/tset_si.c --- mpfr-2.2.0-p1/tests/tset_si.c 2005-08-18 17:03:17.000000000 +0000 +++ mpfr-2.2.0-p2/tests/tset_si.c 2005-09-29 09:19:39.000000000 +0000 @@ -72,6 +72,35 @@ mpfr_clear (x); } +static void +test_macros (void) +{ + mpfr_t x[3]; + mpfr_ptr p; + mpfr_rnd_t r; + + mpfr_inits (x[0], x[1], x[2], NULL); + p = x[0]; + r = 0; + mpfr_set_ui (p++, 0, r++); + if (p != x[1] || r != 1) + { + printf ("Error in mpfr_set_ui macro: p - x[0] = %d (expecting 1), " + "r = %d (expecting 1)\n", (int) (p - x[0]), r); + exit (1); + } + p = x[0]; + r = 0; + mpfr_set_si (p++, 0, r++); + if (p != x[1] || r != 1) + { + printf ("Error in mpfr_set_si macro: p - x[0] = %d (expecting 1), " + "r = %d (expecting 1)\n", (int) (p - x[0]), r); + exit (1); + } + mpfr_clears (x[0], x[1], x[2], NULL); +} + /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to have all tests examine the bits in mpfr_t for what should come out. */ @@ -324,6 +353,7 @@ mpfr_clear (x); test_2exp (); + test_macros (); tests_end_mpfr (); return 0; }