Make third_party/llvm-subzero compatible with C++23 This imports the following change from upstream LLVM. https://github.com/llvm/llvm-project/commit/687bd77e2c26487cba727aacfa7067dd01286be0 Bug: 388070065 Change-Id: Ie337bf08f768f91767a0842f97efe3bd82dfd3bb Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/76508 Reviewed-by: Shahbaz Youssefi <syoussefi@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@google.com> Tested-by: Shahbaz Youssefi <syoussefi@google.com>
diff --git a/third_party/llvm-subzero/include/llvm/ADT/APFloat.h b/third_party/llvm-subzero/include/llvm/ADT/APFloat.h index 0030423..249194f 100644 --- a/third_party/llvm-subzero/include/llvm/ADT/APFloat.h +++ b/third_party/llvm-subzero/include/llvm/ADT/APFloat.h
@@ -618,21 +618,14 @@ DoubleAPFloat(DoubleAPFloat &&RHS); DoubleAPFloat &operator=(const DoubleAPFloat &RHS); - - DoubleAPFloat &operator=(DoubleAPFloat &&RHS) { - if (this != &RHS) { - this->~DoubleAPFloat(); - new (this) DoubleAPFloat(std::move(RHS)); - } - return *this; - } + inline DoubleAPFloat &operator=(DoubleAPFloat &&RHS); bool needsCleanup() const { return Floats != nullptr; } - APFloat &getFirst() { return Floats[0]; } - const APFloat &getFirst() const { return Floats[0]; } - APFloat &getSecond() { return Floats[1]; } - const APFloat &getSecond() const { return Floats[1]; } + inline APFloat &getFirst(); + inline const APFloat &getFirst() const; + inline APFloat &getSecond(); + inline const APFloat &getSecond() const; opStatus add(const DoubleAPFloat &RHS, roundingMode RM); opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM); @@ -1123,6 +1116,27 @@ return (A.compare(B) == APFloat::cmpLessThan) ? B : A; } +// We want the following functions to be available in the header for inlining. +// We cannot define them inline in the class definition of `DoubleAPFloat` +// because doing so would instantiate `std::unique_ptr<APFloat[]>` before +// `APFloat` is defined, and that would be undefined behavior. +namespace detail { + +DoubleAPFloat &DoubleAPFloat::operator=(DoubleAPFloat &&RHS) { + if (this != &RHS) { + this->~DoubleAPFloat(); + new (this) DoubleAPFloat(std::move(RHS)); + } + return *this; +} + +APFloat &DoubleAPFloat::getFirst() { return Floats[0]; } +const APFloat &DoubleAPFloat::getFirst() const { return Floats[0]; } +APFloat &DoubleAPFloat::getSecond() { return Floats[1]; } +const APFloat &DoubleAPFloat::getSecond() const { return Floats[1]; } + +} // namespace detail + } // namespace llvm #endif // LLVM_ADT_APFLOAT_H