Index: include/llvm/ADT/APFloat.h =================================================================== --- include/llvm/ADT/APFloat.h +++ include/llvm/ADT/APFloat.h @@ -537,6 +537,8 @@ void copySignificand(const IEEEFloat &); void freeSignificand(); + void moveFields(IEEEFloat &&); + /// Note: this must be the first data member. /// The semantics that this value obeys. const fltSemantics *semantics; Index: lib/Support/APFloat.cpp =================================================================== --- lib/Support/APFloat.cpp +++ lib/Support/APFloat.cpp @@ -744,9 +744,7 @@ return *this; } -IEEEFloat &IEEEFloat::operator=(IEEEFloat &&rhs) { - freeSignificand(); - +void IEEEFloat::moveFields(IEEEFloat &&rhs) { semantics = rhs.semantics; significand = rhs.significand; exponent = rhs.exponent; @@ -754,6 +752,11 @@ sign = rhs.sign; rhs.semantics = &semBogus; +} + +IEEEFloat &IEEEFloat::operator=(IEEEFloat &&rhs) { + freeSignificand(); + moveFields(std::move(rhs)); return *this; } @@ -873,9 +876,7 @@ assign(rhs); } -IEEEFloat::IEEEFloat(IEEEFloat &&rhs) : semantics(&semBogus) { - *this = std::move(rhs); -} +IEEEFloat::IEEEFloat(IEEEFloat &&rhs) { moveFields(std::move(rhs)); } IEEEFloat::~IEEEFloat() { freeSignificand(); }