I've been working on getting MPIR to compile on Sun CC with --enable- cxx. I've fixed the attribute errors by only defining ATTRIBUTE_* when __GNUC__ is defined. This fixes lots of build warnings actually, though if __GNUC__ is not defined for a compiler which supports attributes, then MPIR could potentially be slightly slower (probably infinitesimally).
But I'm stuck with the following: /* 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 */ struct __gmp_alloc_cstring { char *str; __gmp_alloc_cstring(char *s) { str = s; } ~__gmp_alloc_cstring() { void (*freefunc) (void *, size_t); mp_get_memory_functions (NULL, NULL, &freefunc); (*freefunc) (str, std::strlen(str)+1); } }; The Sun CC compiler says: "../../gmpxx.h", line 1303: Error: Formal argument 3 of type extern "C" void(*)(void*,unsigned long)* in call to __gmp_get_memory_functions (extern "C" void*(*)(unsigned long)*, extern "C" void*(*) (void*,unsigned long,unsigned long)*, extern "C" void(*) (void*,unsigned long)*) is being passed void(*)(void*,unsigned long)*. "../../gmpxx.h", line 1304: Warning: The variable freefunc has not yet been assigned a value. It took me a while to figure out what the code is trying to do. Basically __gmp_free_func is the default function for freeing memory allocated by GMP internally. But the user can actually define their own memory management functions if they want. There's an interface for that, and GMP stores function pointers for the memory managment functions the user specifies. Now if you want to free space allocated by the current memory management function, then you better not call __gmp_free_func, as the user may have replaced it as the current memory management function. Instead you want to call the function the user defined for this purpose. So you need to retrieve the function pointer GMP has stored for this user defined deallocation function. That's what the function mp_get_memory_functions does. If you pass it a reference to a function pointer as the third argument, it will set that function pointer to point to the user defined deallocation function. So in the destructor for this struct, it first declares a function pointer, called freefunc. Then it calls mp_get_memory_functions with a reference to freefunc as its third argument, and this sets that function pointer to be the user defined allocation function. Then it actually calls this deallocation function to deallocate the space allocated by the initialiser for the struct. Now the problem is, for some stupid reason, the sun CC thinks mp_get_memory_functions doesn't take a reference to a function pointer, but a reference to an extern "C" function pointer. I've no idea where it gets that from. The function mp_get_memory_functions is defines in mp_get_gns.c and its prototype is actually: void mp_get_memory_functions (void *(**alloc_func) (size_t), void *(**realloc_func) (void *, size_t, size_t), void (**free_func) (void *, size_t)) Does anyone see how to fix this problem? I'm stumped. Bill. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "mpir-devel" group. To post to this group, send email to mpir-devel@googlegroups.com To unsubscribe from this group, send email to mpir-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/mpir-devel?hl=en -~----------~----~----~----~------~----~------~--~---