From c36e15bd292d3a6aa97091f4eec80e9f2f1b58d8 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Fri, 17 Apr 2015 08:30:45 +0100 Subject: [PATCH] Fix self assignment bug in mpfr_float Fixes: https://svn.boost.org/trac/boost/ticket/11193 --- include/boost/multiprecision/mpfr.hpp | 13 ++++++++----- test/test_arithmetic.hpp | 6 ++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index 02e13a02..ac7699c0 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -831,11 +831,14 @@ struct mpfr_float_backend<0, allocate_dynamic> : public detail::mpfr_float_imp<0 mpfr_float_backend& operator=(const mpfr_float_backend& o) { - if(this->m_data[0]._mpfr_d == 0) - mpfr_init2(this->m_data, mpfr_get_prec(o.data())); - else - mpfr_set_prec(this->m_data, mpfr_get_prec(o.data())); - mpfr_set(this->m_data, o.data(), GMP_RNDN); + if(this != &o) + { + if(this->m_data[0]._mpfr_d == 0) + mpfr_init2(this->m_data, mpfr_get_prec(o.data())); + else + mpfr_set_prec(this->m_data, mpfr_get_prec(o.data())); + mpfr_set(this->m_data, o.data(), GMP_RNDN); + } return *this; } #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES diff --git a/test/test_arithmetic.hpp b/test/test_arithmetic.hpp index b060c4b2..4f68b807 100644 --- a/test/test_arithmetic.hpp +++ b/test/test_arithmetic.hpp @@ -1927,5 +1927,11 @@ void test() // Destructor of "a" checks destruction of moved-from-object... Real m3(static_cast(a)); #endif + // + // Bug cases, self assignment first: + // + a = 20; + a = a; + BOOST_CHECK_EQUAL(a, 20); }