
Torbjorn Granlund wrote:
There is now a GMP 4.2 release candidate available, please test it and report problems and successes to me (not to any GMP list).
The tar file is here:
ftp://ftp.swox.com/pub/gmp/src/gmp-4.1.99.tar.bz2
Unless something terrible shows up, I will release GMP 4.2 tomorrow.
A bug has been introduced into the C++ interface. This is witnessed by the following program:
#include <gmpxx.h>
void foo(mpz_class& a, const mpz_class& b, const mpz_class& c, const mpz_class& d) { a = b*a - c*d; }
It does just fine with GMP 4.1.4, but with the release candidate I obtain the following:
$ g++ -v Reading specs from /usr/local/lib/gcc/i686-pc-linux-gnu/3.4.4/specs Configured with: ../gcc-3.4.4/configure --prefix=/usr/local Thread model: posix gcc version 3.4.4 $ g++ -c bug.cc bug.cc: In function `void foo(mpz_class&, const mpz_class&, const mpz_class&, const mpz_class&)': bug.cc:5: error: ambiguous class template instantiation for `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >' /usr/local/include/gmpxx.h:4585: error: candidates are: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], V>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<T, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], V>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, U, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], V>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, __gmp_expr<__mpz_struct[1], T>, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<T, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, T, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4585: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], T>, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], U>, __gmp_expr<__mpz_struct[1], V>, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<U, __gmp_expr<__mpz_struct[1], V>, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], U>, V, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], U>, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, __gmp_expr<__mpz_struct[1], U>, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<U, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, U, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:4581: error: class __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], T>, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> > /usr/local/include/gmpxx.h:3549: error: class __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> > /usr/local/include/gmpxx.h:3516: error: class __gmp_expr<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> > /usr/local/include/gmpxx.h:3483: error: class __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> > /usr/local/include/gmpxx.h:3452: error: class __gmp_expr<T, __gmp_binary_expr<U, __gmp_expr<T, V>, Op> > /usr/local/include/gmpxx.h:3425: error: class __gmp_expr<T, __gmp_binary_expr<__gmp_expr<T, U>, V, Op> > bug.cc:5: error: invalid use of undefined type `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >' /usr/local/include/gmpxx.h:1885: error: declaration of `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >' /usr/local/include/gmpxx.h: In function `__gmp_expr<typename __gmp_resolve_expr<T, V>::value_type, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, __gmp_binary_minus> > operator-(const __gmp_expr<T, U>&, const __gmp_expr<V, W>&) [with T = __mpz_struct[1], U = __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies>, V = __mpz_struct[1], W = __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies>]': bug.cc:5: instantiated from here /usr/local/include/gmpxx.h:4898: error: return type `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >' is incomplete /usr/local/include/gmpxx.h:4898: error: invalid use of undefined type `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >' /usr/local/include/gmpxx.h:1885: error: declaration of `struct __gmp_expr<__mpz_struct[1], __gmp_binary_expr<__gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_expr<__mpz_struct[1], __gmp_binary_expr<mpz_class, mpz_class, __gmp_binary_multiplies> >, __gmp_binary_minus> >'
All the best,
Roberto