diff options
author | Nguyễn Gia Phong <cnx@loang.net> | 2024-02-29 23:24:33 +0900 |
---|---|---|
committer | Nguyễn Gia Phong <cnx@loang.net> | 2024-03-01 01:55:07 +0900 |
commit | 0711a8360c18ac45756ae773a1c0e326f6de4789 (patch) | |
tree | 38d69217cf2dfbd27b0b35a6ccbec0708795e403 | |
parent | 2d683e0c53907ebca9abde876dd87af70719e42d (diff) | |
download | roux-0711a8360c18ac45756ae773a1c0e326f6de4789.tar.gz |
test/fpcnv: skip comparing inexactly converted int
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.
-rw-r--r-- | test/fpcnv.ssa | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/test/fpcnv.ssa b/test/fpcnv.ssa index 3466ed2..3fe078f 100644 --- a/test/fpcnv.ssa +++ b/test/fpcnv.ssa @@ -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; |