test/fpcnv: skip of inexactly converted integers

In C, if a floating point cannot be represented exactly as an integer,
conversion from the former to the latter is implementation-defined.
Therefore, it can be flaky to test this against QBE-defined behavior.

This was discovered from (unsigned int) 4294967295.0f being an UB,
because (uint64_t) 4294967295.0f is 4294967296 > UINT_MAX
on amd64 when compiled by either gcc or clang.
This commit is contained in:
Nguyễn Gia Phong 2024-02-29 23:44:07 +09:00 committed by Quentin Carbonneaux
parent b582e84e10
commit be5d46fe7d

View file

@ -72,6 +72,7 @@ function l $dtol(d %f) {
# >>> driver
# #include <float.h>
# #include <limits.h>
#
# extern float fneg(float);
@ -113,15 +114,19 @@ function l $dtol(d %f) {
# return 7;
# }
# for (i=0; i<sizeof(fin)/sizeof(fin[0]); i++) {
# if (stol((float)fin[i]) != (unsigned long long)(float)fin[i])
# return 8;
# if (fin[i] >= 1LL << DBL_MANT_DIG)
# break;
# if (dtol(fin[i]) != (unsigned long long)fin[i])
# return 9;
# return 8;
# if((unsigned long long)fin[i] > UINT_MAX)
# continue;
# if (stow((float)fin[i]) != (unsigned int)(float)fin[i])
# return 10;
# if (dtow(fin[i]) != (unsigned int)fin[i])
# return 9;
# if (fin[i] >= 1LL << FLT_MANT_DIG)
# continue;
# if (stol((float)fin[i]) != (unsigned long long)(float)fin[i])
# return 10;
# if (stow((float)fin[i]) != (unsigned int)(float)fin[i])
# return 11;
# }
# return 0;