Skip to content
Permalink
Browse files

Fix the part of the float test that requires IEC559/IEEE754 compliance

GCC and CLang compilers fail to support full IEC559 compliance required for the test, when certain compiler flags are active. This patch implements a heuristic that checks for the most common flag in GCC and CLang, plues an extra check which GCC disables when it's not compliant, to hopefully catch most cases where it can't run.
  • Loading branch information...
Pedro Gimeno authored and nerzhul committed Dec 18, 2018
1 parent 7a4d4bc commit 8e4095f06832f4a786a77f4513f6fca9c1f6cc2b
Showing with 13 additions and 0 deletions.
  1. +13 −0 src/unittest/test_serialization.cpp
@@ -674,6 +674,19 @@ void TestSerialization::testFloatFormat()
return;
}

// The code below compares the IEEE conversion functions with a
// known good IEC559/IEEE754 implementation. This test neeeds
// IEC559 compliance in the compiler.
#if defined(__GNUC__) && (!defined(__STDC_IEC_559__) || defined(__FAST_MATH__))
// GNU C++ lies about its IEC559 support when -ffast-math is active.
// https://gcc.gnu.org/bugzilla//show_bug.cgi?id=84949
bool is_iec559 = false;
#else
bool is_iec559 = std::numeric_limits<f32>::is_iec559;
#endif
if (!is_iec559)
return;

auto test_single = [&fs, &fm](const u32 &i) -> bool {
memcpy(&fm, &i, 4);
fs = u32Tof32Slow(i);

0 comments on commit 8e4095f

Please sign in to comment.
You can’t perform that action at this time.