diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h index 64e56a0ef6a0..33f997e17342 100644 --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -201,6 +201,9 @@ public: /// @} + /// \brief Returns whether this instance allocated memory. + bool needsCleanup() const { return partCount() > 1; } + /// \name Convenience "constructors" /// @{ diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h index a9df4036be2d..e5797b8be238 100644 --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -293,7 +293,7 @@ public: /// \brief Destructor. ~APInt() { - if (!isSingleWord()) + if (needsCleanup()) delete[] pVal; } @@ -303,6 +303,9 @@ public: /// method Read). explicit APInt() : BitWidth(1) {} + /// \brief Returns whether this instance allocated memory. + bool needsCleanup() const { return !isSingleWord(); } + /// Used to insert APInt objects, or objects that contain APInt objects, into /// FoldingSets. void Profile(FoldingSetNodeID &id) const; diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index 16586fbc9e80..2ad66c5687c9 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -580,7 +580,7 @@ APFloat::initialize(const fltSemantics *ourSemantics) void APFloat::freeSignificand() { - if (partCount() > 1) + if (needsCleanup()) delete [] significand.parts; }