Merge pull request #7327 from BillyONeal/master

Workaround use of private constant _Snan no longer being present in <limits>
This commit is contained in:
Pierre Bourdon 2018-08-13 21:56:55 +02:00 committed by GitHub
commit 60f12e1d4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,6 +10,18 @@
#include "Common/BitUtils.h"
#include "Common/CommonTypes.h"
#ifdef _MSC_VER
// MSVC needs a workaround, because its std::numeric_limits<double>::signaling_NaN()
// will use __builtin_nans, which is improperly handled by the compiler and generates
// a bad constant. Here we go back to the version MSVC used before the builtin.
// TODO: Remove this and use numeric_limits directly whenever this bug is fixed.
// See Visual Studio bug # 128935 "std::numeric_limits<float>::signaling_NaN() is broken"
#include <ymath.h>
#endif // _MSC_VER
namespace Common
{
template <typename T>
@ -20,10 +32,7 @@ constexpr T SNANConstant()
#ifdef _MSC_VER
// MSVC needs a workaround, because its std::numeric_limits<double>::signaling_NaN()
// will use __builtin_nans, which is improperly handled by the compiler and generates
// a bad constant. Here we go back to the version MSVC used before the builtin.
// TODO: Remove this and use numeric_limits directly whenever this bug is fixed.
// See workaround note above.
template <>
constexpr double SNANConstant()
@ -36,7 +45,7 @@ constexpr float SNANConstant()
return (_CSTD _Snan._Float);
}
#endif
#endif // _MSC_VER
// The most significant bit of the fraction is an is-quiet bit on all architectures we care about.
enum : u64