aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Gimeno <pgimeno@users.noreply.notabug.org>2018-12-18 11:47:29 +0100
committerLoïc Blot <loic.blot@unix-experience.fr>2018-12-18 12:27:23 +0100
commit8e4095f06832f4a786a77f4513f6fca9c1f6cc2b (patch)
tree0666b249ba28222238e074accc35b2e15c89b685
parent7a4d4bc9e6064ca083cd412e678f7d0927819438 (diff)
downloadminetest-8e4095f06832f4a786a77f4513f6fca9c1f6cc2b.tar.gz
minetest-8e4095f06832f4a786a77f4513f6fca9c1f6cc2b.tar.bz2
minetest-8e4095f06832f4a786a77f4513f6fca9c1f6cc2b.zip
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.
-rw-r--r--src/unittest/test_serialization.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/unittest/test_serialization.cpp b/src/unittest/test_serialization.cpp
index b526792c4..ca4116413 100644
--- a/src/unittest/test_serialization.cpp
+++ b/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);