Skip to content

Commit

Permalink
dev-libs/mpfr: backport mpfr_custom_get_kind macro fix
Browse files Browse the repository at this point in the history
Closes: https://bugs.gentoo.org/881995
Signed-off-by: Sam James <[email protected]>
  • Loading branch information
thesamesam committed Nov 22, 2022
1 parent 6c3e73c commit bb48158
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
79 changes: 79 additions & 0 deletions dev-libs/mpfr/files/mpfr-4.1.1-fix-mpfr_custom_get_kind.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
https://bugs.gentoo.org/881995
https://gitlab.inria.fr/mpfr/mpfr/-/commit/3cd39bc0b71ad2fb2ab5252ad9268b14603e3ce6
https://gitlab.inria.fr/mpfr/mpfr/-/issues/1
https://github.com/CGAL/cgal/issues/7064

From 3cd39bc0b71ad2fb2ab5252ad9268b14603e3ce6 Mon Sep 17 00:00:00 2001
From: Vincent Lefevre <[email protected]>
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

(cherry picked from commit 0ce17bae34a6c54de31b126f969d3ddd72c6bc37)
--- a/src/mpfr.h
+++ b/src/mpfr.h
@@ -1027,7 +1027,7 @@ __MPFR_DECLSPEC int mpfr_total_order_p (mpfr_srcptr, mpfr_srcptr);
#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. */
GitLab
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ PATCHES=(
"${MY_PATCHES[@]}"

# Additional patches
"${FILESDIR}"/${P}-fix-mpfr_custom_get_kind.patch
)

HTML_DOCS=( doc/FAQ.html )
Expand Down

0 comments on commit bb48158

Please sign in to comment.