Index: clang/lib/AST/Interp/Floating.h =================================================================== --- clang/lib/AST/Interp/Floating.h +++ clang/lib/AST/Interp/Floating.h @@ -102,7 +102,18 @@ APFloat::fltCategory getCategory() const { return F.getCategory(); } ComparisonCategoryResult compare(const Floating &RHS) const { - return Compare(F, RHS.F); + llvm::APFloatBase::cmpResult CmpRes = F.compare(RHS.F); + switch (CmpRes) { + case llvm::APFloatBase::cmpLessThan: + return ComparisonCategoryResult::Less; + case llvm::APFloatBase::cmpEqual: + return ComparisonCategoryResult::Equal; + case llvm::APFloatBase::cmpGreaterThan: + return ComparisonCategoryResult::Greater; + case llvm::APFloatBase::cmpUnordered: + return ComparisonCategoryResult::Unordered; + } + llvm_unreachable("Inavlid cmpResult value"); } static APFloat::opStatus fromIntegral(APSInt Val, Index: clang/test/AST/Interp/floats.cpp =================================================================== --- clang/test/AST/Interp/floats.cpp +++ clang/test/AST/Interp/floats.cpp @@ -148,3 +148,12 @@ }; static_assert(f() == __LDBL_MAX__); } + +namespace Compare { + constexpr float nan = __builtin_nan(""); + constexpr float inf = __builtin_inf(); + static_assert(!(nan == nan), ""); + static_assert(nan != nan, ""); + static_assert(!(inf < nan), ""); + static_assert(!(inf > nan), ""); +}