diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h index 70fbf2059841e..00d92740259eb 100644 --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -805,7 +805,7 @@ IEEEFloat frexp(const IEEEFloat &Val, int &Exp, roundingMode RM); class DoubleAPFloat final { // Note: this must be the first data member. const fltSemantics *Semantics; - std::unique_ptr Floats; + APFloat *Floats; opStatus addImpl(const APFloat &a, const APFloat &aa, const APFloat &c, const APFloat &cc, roundingMode RM); @@ -821,6 +821,7 @@ class DoubleAPFloat final { DoubleAPFloat(const fltSemantics &S, APFloat &&First, APFloat &&Second); DoubleAPFloat(const DoubleAPFloat &RHS); DoubleAPFloat(DoubleAPFloat &&RHS); + ~DoubleAPFloat(); DoubleAPFloat &operator=(const DoubleAPFloat &RHS); inline DoubleAPFloat &operator=(DoubleAPFloat &&RHS); @@ -1659,6 +1660,8 @@ const APFloat &DoubleAPFloat::getFirst() const { return Floats[0]; } APFloat &DoubleAPFloat::getSecond() { return Floats[1]; } const APFloat &DoubleAPFloat::getSecond() const { return Floats[1]; } +inline DoubleAPFloat::~DoubleAPFloat() { delete[] Floats; } + } // namespace detail } // namespace llvm diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index cbee7f48b8773..cfc3c3b4974c5 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -4876,8 +4876,9 @@ DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS) } DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS) - : Semantics(RHS.Semantics), Floats(std::move(RHS.Floats)) { + : Semantics(RHS.Semantics), Floats(RHS.Floats) { RHS.Semantics = &semBogus; + RHS.Floats = nullptr; assert(Semantics == &semPPCDoubleDouble); }