c++ patch

Marc Glisse marc.glisse at normalesup.org
Thu May 11 17:26:23 CEST 2006


Hello,

I attach a patch that I am using. It in particular helps me on solaris, 
where I use:
CC=cc
CXX=CC
ABI=32
CXXFLAGS=-library=stlport4

Some cxx tests (t-binary t-ops t-prec t-ternary t-unary) still fail to 
compile, but I believe it is because of bugs in the compiler (whereas what 
I patched looks like bugs in the code).

A bit more details:
there are a number of missing std:: for c++ use. Since gmp-impl.h is not 
installed, it can just use the easy "using namespace std;". For gmp.h, I 
did something cleaner (It is better for standard conformance, but I am not 
sure it may not hurt some broken c++ compiler).
The typedef in gmpxx.h is because a C linkage function and a C++ linkage 
function need not look the same I think.

I will check again after the next patch to sun's c++ compiler (the one 
released today was a disappointment).

-- 
Marc Glisse
-------------- next part --------------
--- gmp-4.2.1/gmpxx.h	2006-04-08 21:15:38.000000000 +0200
+++ gmp-4.2.1.new/gmpxx.h	2006-05-11 16:15:27.978711000 +0200
@@ -1379,13 +1379,14 @@
 /* this is much the same as gmp_allocated_string in gmp-impl.h
    since gmp-impl.h is not publicly available, I redefine it here
    I use a different name to avoid possible clashes */
+extern "C" typedef void (*_gmp_freefunc_type) (void *, size_t);
 struct __gmp_alloc_cstring
 {
   char *str;
   __gmp_alloc_cstring(char *s) { str = s; }
   ~__gmp_alloc_cstring()
   {
-    void (*freefunc) (void *, size_t);
+    _gmp_freefunc_type freefunc;
     mp_get_memory_functions (NULL, NULL, &freefunc);
     (*freefunc) (str, std::strlen(str)+1);
   }
--- gmp-4.2.1/gmp-h.in	2006-04-11 20:10:15.000000000 +0200
+++ gmp-4.2.1.new/gmp-h.in	2006-05-11 15:57:12.128198000 +0200
@@ -49,8 +49,10 @@
 
 #define __need_size_t  /* tell gcc stddef.h we only want size_t */
 #if defined (__cplusplus)
+#define GMP_CSTD std::
 #include <cstddef>     /* for size_t */
 #else
+#define GMP_CSTD
 #include <stddef.h>    /* for size_t */
 #endif
 #undef __need_size_t
@@ -512,18 +514,17 @@
 
 #if defined (__cplusplus)
 extern "C" {
-using std::FILE;
 #endif
 
 #define mp_set_memory_functions __gmp_set_memory_functions
-__GMP_DECLSPEC void mp_set_memory_functions __GMP_PROTO ((void *(*) (size_t),
-				      void *(*) (void *, size_t, size_t),
-				      void (*) (void *, size_t))) __GMP_NOTHROW;
+__GMP_DECLSPEC void mp_set_memory_functions __GMP_PROTO ((void *(*) (GMP_CSTD size_t),
+				      void *(*) (void *, GMP_CSTD size_t, GMP_CSTD size_t),
+				      void (*) (void *, GMP_CSTD size_t))) __GMP_NOTHROW;
 
 #define mp_get_memory_functions __gmp_get_memory_functions
-__GMP_DECLSPEC void mp_get_memory_functions __GMP_PROTO ((void *(**) (size_t),
-                                      void *(**) (void *, size_t, size_t),
-                                      void (**) (void *, size_t))) __GMP_NOTHROW;
+__GMP_DECLSPEC void mp_get_memory_functions __GMP_PROTO ((void *(**) (GMP_CSTD size_t),
+                                      void *(**) (void *, GMP_CSTD size_t, GMP_CSTD size_t),
+                                      void (**) (void *, GMP_CSTD size_t))) __GMP_NOTHROW;
 
 #define mp_bits_per_limb __gmp_bits_per_limb
 __GMP_DECLSPEC extern __gmp_const int mp_bits_per_limb;
@@ -581,7 +582,7 @@
 
 #define gmp_fprintf __gmp_fprintf
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC int gmp_fprintf __GMP_PROTO ((FILE *, __gmp_const char *, ...));
+__GMP_DECLSPEC int gmp_fprintf __GMP_PROTO ((GMP_CSTD FILE *, __gmp_const char *, ...));
 #endif
 
 #define gmp_obstack_printf __gmp_obstack_printf
@@ -591,41 +592,41 @@
 
 #define gmp_obstack_vprintf __gmp_obstack_vprintf
 #if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_obstack_vprintf __GMP_PROTO ((struct obstack *, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_obstack_vprintf __GMP_PROTO ((struct obstack *, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_printf __gmp_printf
 __GMP_DECLSPEC int gmp_printf __GMP_PROTO ((__gmp_const char *, ...));
 
 #define gmp_snprintf __gmp_snprintf
-__GMP_DECLSPEC int gmp_snprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, ...));
+__GMP_DECLSPEC int gmp_snprintf __GMP_PROTO ((char *, GMP_CSTD size_t, __gmp_const char *, ...));
 
 #define gmp_sprintf __gmp_sprintf
 __GMP_DECLSPEC int gmp_sprintf __GMP_PROTO ((char *, __gmp_const char *, ...));
 
 #define gmp_vasprintf __gmp_vasprintf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vasprintf __GMP_PROTO ((char **, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vasprintf __GMP_PROTO ((char **, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vfprintf __gmp_vfprintf
 #if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vfprintf __GMP_PROTO ((FILE *, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vfprintf __GMP_PROTO ((GMP_CSTD FILE *, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vprintf __gmp_vprintf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vprintf __GMP_PROTO ((__gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vprintf __GMP_PROTO ((__gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vsnprintf __gmp_vsnprintf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vsnprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vsnprintf __GMP_PROTO ((char *, GMP_CSTD size_t, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vsprintf __gmp_vsprintf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vsprintf __GMP_PROTO ((char *, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vsprintf __GMP_PROTO ((char *, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 
@@ -633,7 +634,7 @@
 
 #define gmp_fscanf __gmp_fscanf
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC int gmp_fscanf __GMP_PROTO ((FILE *, __gmp_const char *, ...));
+__GMP_DECLSPEC int gmp_fscanf __GMP_PROTO ((GMP_CSTD FILE *, __gmp_const char *, ...));
 #endif
 
 #define gmp_scanf __gmp_scanf
@@ -644,17 +645,17 @@
 
 #define gmp_vfscanf __gmp_vfscanf
 #if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vfscanf __GMP_PROTO ((FILE *, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vfscanf __GMP_PROTO ((GMP_CSTD FILE *, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vscanf __gmp_vscanf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vscanf __GMP_PROTO ((__gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vscanf __GMP_PROTO ((__gmp_const char *, GMP_CSTD va_list));
 #endif
 
 #define gmp_vsscanf __gmp_vsscanf
 #if defined (_GMP_H_HAVE_VA_LIST)
-__GMP_DECLSPEC int gmp_vsscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, va_list));
+__GMP_DECLSPEC int gmp_vsscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, GMP_CSTD va_list));
 #endif
 
 
@@ -781,7 +782,7 @@
 __GMP_DECLSPEC void mpz_dump __GMP_PROTO ((mpz_srcptr));
 
 #define mpz_export __gmpz_export
-__GMP_DECLSPEC void *mpz_export __GMP_PROTO ((void *, size_t *, int, size_t, int, size_t, mpz_srcptr));
+__GMP_DECLSPEC void *mpz_export __GMP_PROTO ((void *, GMP_CSTD size_t *, int, GMP_CSTD size_t, int, GMP_CSTD size_t, mpz_srcptr));
 
 #define mpz_fac_ui __gmpz_fac_ui
 __GMP_DECLSPEC void mpz_fac_ui __GMP_PROTO ((mpz_ptr, unsigned long int));
@@ -878,7 +879,7 @@
 __GMP_DECLSPEC unsigned long int mpz_hamdist __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
 
 #define mpz_import __gmpz_import
-__GMP_DECLSPEC void mpz_import __GMP_PROTO ((mpz_ptr, size_t, int, size_t, int, size_t, __gmp_const void *));
+__GMP_DECLSPEC void mpz_import __GMP_PROTO ((mpz_ptr, GMP_CSTD size_t, int, GMP_CSTD size_t, int, GMP_CSTD size_t, __gmp_const void *));
 
 #define mpz_init __gmpz_init
 __GMP_DECLSPEC void mpz_init __GMP_PROTO ((mpz_ptr));
@@ -903,12 +904,12 @@
 
 #define mpz_inp_raw __gmpz_inp_raw
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpz_inp_raw __GMP_PROTO ((mpz_ptr, FILE *));
+__GMP_DECLSPEC GMP_CSTD size_t mpz_inp_raw __GMP_PROTO ((mpz_ptr, GMP_CSTD FILE *));
 #endif
 
 #define mpz_inp_str __gmpz_inp_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, FILE *, int));
+__GMP_DECLSPEC GMP_CSTD size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, GMP_CSTD FILE *, int));
 #endif
 
 #define mpz_invert __gmpz_invert
@@ -978,12 +979,12 @@
 
 #define mpz_out_raw __gmpz_out_raw
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpz_out_raw __GMP_PROTO ((FILE *, mpz_srcptr));
+__GMP_DECLSPEC GMP_CSTD size_t mpz_out_raw __GMP_PROTO ((GMP_CSTD FILE *, mpz_srcptr));
 #endif
 
 #define mpz_out_str __gmpz_out_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpz_out_str __GMP_PROTO ((FILE *, int, mpz_srcptr));
+__GMP_DECLSPEC GMP_CSTD size_t mpz_out_str __GMP_PROTO ((GMP_CSTD FILE *, int, mpz_srcptr));
 #endif
 
 #define mpz_perfect_power_p __gmpz_perfect_power_p
@@ -1066,11 +1067,11 @@
 
 #define mpz_size __gmpz_size
 #if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size)
-__GMP_DECLSPEC size_t mpz_size __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
+__GMP_DECLSPEC GMP_CSTD size_t mpz_size __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
 #endif
 
 #define mpz_sizeinbase __gmpz_sizeinbase
-__GMP_DECLSPEC size_t mpz_sizeinbase __GMP_PROTO ((mpz_srcptr, int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
+__GMP_DECLSPEC GMP_CSTD size_t mpz_sizeinbase __GMP_PROTO ((mpz_srcptr, int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
 
 #define mpz_sqrt __gmpz_sqrt
 __GMP_DECLSPEC void mpz_sqrt __GMP_PROTO ((mpz_ptr, mpz_srcptr));
@@ -1191,7 +1192,7 @@
 
 #define mpq_inp_str __gmpq_inp_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpq_inp_str __GMP_PROTO ((mpq_ptr, FILE *, int));
+__GMP_DECLSPEC GMP_CSTD size_t mpq_inp_str __GMP_PROTO ((mpq_ptr, GMP_CSTD FILE *, int));
 #endif
 
 #define mpq_inv __gmpq_inv
@@ -1210,7 +1211,7 @@
 
 #define mpq_out_str __gmpq_out_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpq_out_str __GMP_PROTO ((FILE *, int, mpq_srcptr));
+__GMP_DECLSPEC GMP_CSTD size_t mpq_out_str __GMP_PROTO ((GMP_CSTD FILE *, int, mpq_srcptr));
 #endif
 
 #define mpq_set __gmpq_set
@@ -1327,7 +1328,7 @@
 __GMP_DECLSPEC long mpf_get_si __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
 
 #define mpf_get_str __gmpf_get_str
-__GMP_DECLSPEC char *mpf_get_str __GMP_PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr));
+__GMP_DECLSPEC char *mpf_get_str __GMP_PROTO ((char *, mp_exp_t *, int, GMP_CSTD size_t, mpf_srcptr));
 
 #define mpf_get_ui __gmpf_get_ui
 __GMP_DECLSPEC unsigned long mpf_get_ui __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
@@ -1355,7 +1356,7 @@
 
 #define mpf_inp_str __gmpf_inp_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpf_inp_str __GMP_PROTO ((mpf_ptr, FILE *, int));
+__GMP_DECLSPEC GMP_CSTD size_t mpf_inp_str __GMP_PROTO ((mpf_ptr, GMP_CSTD FILE *, int));
 #endif
 
 #define mpf_integer_p __gmpf_integer_p
@@ -1375,7 +1376,7 @@
 
 #define mpf_out_str __gmpf_out_str
 #ifdef _GMP_H_HAVE_FILE
-__GMP_DECLSPEC size_t mpf_out_str __GMP_PROTO ((FILE *, int, size_t, mpf_srcptr));
+__GMP_DECLSPEC GMP_CSTD size_t mpf_out_str __GMP_PROTO ((GMP_CSTD FILE *, int, GMP_CSTD size_t, mpf_srcptr));
 #endif
 
 #define mpf_pow_ui __gmpf_pow_ui
@@ -1418,7 +1419,7 @@
 __GMP_DECLSPEC void mpf_set_z __GMP_PROTO ((mpf_ptr, mpz_srcptr));
 
 #define mpf_size __gmpf_size
-__GMP_DECLSPEC size_t mpf_size __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
+__GMP_DECLSPEC GMP_CSTD size_t mpf_size __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE;
 
 #define mpf_sqrt __gmpf_sqrt
 __GMP_DECLSPEC void mpf_sqrt __GMP_PROTO ((mpf_ptr, mpf_srcptr));
@@ -1553,7 +1554,7 @@
 __GMP_DECLSPEC unsigned long int mpn_scan1 __GMP_PROTO ((mp_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE;
 
 #define mpn_set_str __MPN(set_str)
-__GMP_DECLSPEC mp_size_t mpn_set_str __GMP_PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int));
+__GMP_DECLSPEC mp_size_t mpn_set_str __GMP_PROTO ((mp_ptr, __gmp_const unsigned char *, GMP_CSTD size_t, int));
 
 #define mpn_sqrtrem __MPN(sqrtrem)
 __GMP_DECLSPEC mp_size_t mpn_sqrtrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
@@ -1753,7 +1754,7 @@
 #if ! defined (__GMP_FORCE_mpz_size)
 __GMP_EXTERN_INLINE
 #endif
-size_t
+GMP_CSTD size_t
 mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW
 {
   return __GMP_ABS (__gmp_z->_mp_size);
--- gmp-4.2.1/gmp-impl.h	2006-04-08 21:32:18.000000000 +0200
+++ gmp-4.2.1.new/gmp-impl.h	2006-05-11 15:47:49.897143000 +0200
@@ -119,6 +119,7 @@
 #ifdef __cplusplus
 #include <cstring>  /* for strlen */
 #include <string>   /* for std::string */
+using namespace std;
 #endif
 
 


More information about the gmp-bugs mailing list