summaryrefslogtreecommitdiff
path: root/dev-libs/mpfr/files/mpfr-4.1.1-fix-mpfr_custom_get_kind.patch
blob: d2521f2fa632240d9c4ae3b46d982f46442ea465 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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 <vincent@vinc17.net>
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