summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--gmpxx.h4
-rw-r--r--tests/cxx/t-cxx11.cc13
3 files changed, 17 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 745e3f9c5..26aba1eee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/gmpxx.h b/gmpxx.h
index 6dd9129c5..958136703 100644
--- a/gmpxx.h
+++ b/gmpxx.h
@@ -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);