@@ -322,7 +322,38 @@ struct APFloatBase {
322322
323323namespace detail {
324324
325- class IEEEFloat final : public APFloatBase {
325+ using integerPart = APFloatBase::integerPart;
326+ using uninitializedTag = APFloatBase::uninitializedTag;
327+ using roundingMode = APFloatBase::roundingMode;
328+ using opStatus = APFloatBase::opStatus;
329+ using cmpResult = APFloatBase::cmpResult;
330+ using fltCategory = APFloatBase::fltCategory;
331+ using ExponentType = APFloatBase::ExponentType;
332+ static constexpr uninitializedTag uninitialized = APFloatBase::uninitialized;
333+ static constexpr roundingMode rmNearestTiesToEven =
334+ APFloatBase::rmNearestTiesToEven;
335+ static constexpr roundingMode rmNearestTiesToAway =
336+ APFloatBase::rmNearestTiesToAway;
337+ static constexpr roundingMode rmTowardNegative = APFloatBase::rmTowardNegative;
338+ static constexpr roundingMode rmTowardPositive = APFloatBase::rmTowardPositive;
339+ static constexpr roundingMode rmTowardZero = APFloatBase::rmTowardZero;
340+ static constexpr unsigned integerPartWidth = APFloatBase::integerPartWidth;
341+ static constexpr cmpResult cmpEqual = APFloatBase::cmpEqual;
342+ static constexpr cmpResult cmpLessThan = APFloatBase::cmpLessThan;
343+ static constexpr cmpResult cmpGreaterThan = APFloatBase::cmpGreaterThan;
344+ static constexpr cmpResult cmpUnordered = APFloatBase::cmpUnordered;
345+ static constexpr opStatus opOK = APFloatBase::opOK;
346+ static constexpr opStatus opInvalidOp = APFloatBase::opInvalidOp;
347+ static constexpr opStatus opDivByZero = APFloatBase::opDivByZero;
348+ static constexpr opStatus opOverflow = APFloatBase::opOverflow;
349+ static constexpr opStatus opUnderflow = APFloatBase::opUnderflow;
350+ static constexpr opStatus opInexact = APFloatBase::opInexact;
351+ static constexpr fltCategory fcInfinity = APFloatBase::fcInfinity;
352+ static constexpr fltCategory fcNaN = APFloatBase::fcNaN;
353+ static constexpr fltCategory fcNormal = APFloatBase::fcNormal;
354+ static constexpr fltCategory fcZero = APFloatBase::fcZero;
355+
356+ class IEEEFloat final {
326357public:
327358 // / \name Constructors
328359 // / @{
@@ -433,7 +464,7 @@ class IEEEFloat final : public APFloatBase {
433464 bool isFinite () const { return !isNaN () && !isInfinity (); }
434465
435466 // / Returns true if and only if the float is plus or minus zero.
436- bool isZero () const { return category == fcZero; }
467+ bool isZero () const { return category == fltCategory:: fcZero; }
437468
438469 // / IEEE-754R isSubnormal(): Returns true if and only if the float is a
439470 // / denormal.
@@ -455,7 +486,7 @@ class IEEEFloat final : public APFloatBase {
455486
456487 fltCategory getCategory () const { return category; }
457488 const fltSemantics &getSemantics () const { return *semantics; }
458- bool isNonZero () const { return category != fcZero; }
489+ bool isNonZero () const { return category != fltCategory:: fcZero; }
459490 bool isFiniteNonZero () const { return isFinite () && !isZero (); }
460491 bool isPosZero () const { return isZero () && !isNegative (); }
461492 bool isNegZero () const { return isZero () && isNegative (); }
@@ -719,14 +750,14 @@ class IEEEFloat final : public APFloatBase {
719750
720751hash_code hash_value (const IEEEFloat &Arg);
721752int ilogb (const IEEEFloat &Arg);
722- IEEEFloat scalbn (IEEEFloat X, int Exp, IEEEFloat:: roundingMode);
723- IEEEFloat frexp (const IEEEFloat &Val, int &Exp, IEEEFloat:: roundingMode RM);
753+ IEEEFloat scalbn (IEEEFloat X, int Exp, roundingMode);
754+ IEEEFloat frexp (const IEEEFloat &Val, int &Exp, roundingMode RM);
724755
725756// This mode implements more precise float in terms of two APFloats.
726757// The interface and layout is designed for arbitrary underlying semantics,
727758// though currently only PPCDoubleDouble semantics are supported, whose
728759// corresponding underlying semantics are IEEEdouble.
729- class DoubleAPFloat final : public APFloatBase {
760+ class DoubleAPFloat final {
730761 // Note: this must be the first data member.
731762 const fltSemantics *Semantics;
732763 std::unique_ptr<APFloat[]> Floats;
@@ -819,8 +850,8 @@ class DoubleAPFloat final : public APFloatBase {
819850};
820851
821852hash_code hash_value (const DoubleAPFloat &Arg);
822- DoubleAPFloat scalbn (const DoubleAPFloat &Arg, int Exp, IEEEFloat:: roundingMode RM);
823- DoubleAPFloat frexp (const DoubleAPFloat &X, int &Exp, IEEEFloat:: roundingMode);
853+ DoubleAPFloat scalbn (const DoubleAPFloat &Arg, int Exp, roundingMode RM);
854+ DoubleAPFloat frexp (const DoubleAPFloat &X, int &Exp, roundingMode);
824855
825856} // End detail namespace
826857
@@ -1440,6 +1471,9 @@ class APFloat : public APFloatBase {
14401471 friend DoubleAPFloat;
14411472};
14421473
1474+ static_assert (sizeof (APFloat) == sizeof (detail::IEEEFloat),
1475+ " Empty base class optimization is not performed." );
1476+
14431477// / See friend declarations above.
14441478// /
14451479// / These additional declarations are required in order to compile LLVM with IBM
0 commit comments