diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gmpxx.h | 4 | ||||
-rw-r--r-- | tests/cxx/t-cxx11.cc | 13 |
3 files changed, 17 insertions, 6 deletions
@@ -1,3 +1,9 @@ +2014-05-08 Marc Glisse <marc.glisse@inria.fr> + + * gmpxx.h (std::common_type): Remove partial specialization for two + identical expressions. New partial specialization for a single type. + * tests/cxx/t-cxx11.cc: Test it. + 2014-04-14 Niels Möller <nisse@lysator.liu.se> * doc/gmp.texi (mpz_invert): Clarify behavior in the zero ring. @@ -1232,9 +1232,9 @@ namespace std { }; template <class T, class U> - struct common_type <__gmp_expr<T, U>, __gmp_expr<T, U> > + struct common_type <__gmp_expr<T, U> > { - typedef __gmp_expr<T, U> type; + typedef __gmp_expr<T, T> type; }; #define __GMPXX_DECLARE_COMMON_TYPE(typ) \ diff --git a/tests/cxx/t-cxx11.cc b/tests/cxx/t-cxx11.cc index 758f01638..1f314ff03 100644 --- a/tests/cxx/t-cxx11.cc +++ b/tests/cxx/t-cxx11.cc @@ -42,6 +42,8 @@ void check_noexcept () void check_common_type () { +#define CHECK_COMMON_TYPE1(T, Res) \ + static_assert(std::is_same<std::common_type<T>::type, Res>::value, "sorry") #define CHECK_COMMON_TYPE(T, U, Res) \ static_assert(std::is_same<std::common_type<T, U>::type, Res>::value, "sorry") #define CHECK_COMMON_TYPE_BUILTIN1(T, Res) \ @@ -101,10 +103,13 @@ void check_common_type () CHECK_COMMON_TYPE (decltype(-z), decltype(-f), mpf_class); CHECK_COMMON_TYPE (decltype(-q), decltype(-f), mpf_class); - /* These could be broken by a naive common_type specialization */ - CHECK_COMMON_TYPE (decltype(-z), decltype(-z), decltype(-z)); - CHECK_COMMON_TYPE (decltype(-q), decltype(-q), decltype(-q)); - CHECK_COMMON_TYPE (decltype(-f), decltype(-f), decltype(-f)); + /* common_type now decays */ + CHECK_COMMON_TYPE (decltype(-z), decltype(-z), mpz_class); + CHECK_COMMON_TYPE (decltype(-q), decltype(-q), mpq_class); + CHECK_COMMON_TYPE (decltype(-f), decltype(-f), mpf_class); + CHECK_COMMON_TYPE1 (decltype(-z), mpz_class); + CHECK_COMMON_TYPE1 (decltype(-q), mpq_class); + CHECK_COMMON_TYPE1 (decltype(-f), mpf_class); /* Painful */ CHECK_COMMON_TYPE_BUILTIN (decltype(-z), mpz_class); |