diff options
| author | Nguyễn Gia Phong <[email protected]> | 2024-02-29 23:44:07 +0900 |
|---|---|---|
| committer | Quentin Carbonneaux <[email protected]> | 2024-03-07 16:52:43 +0100 |
| commit | be5d46fe7d876a0722c9475ae9dbc7baa60de46a (patch) | |
| tree | 706a4a7befffb44fb41a69c86947eb1be25199fe /test | |
| parent | b582e84e10189334439377125e61fe43a3ce216c (diff) | |
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.
Diffstat (limited to 'test')
| -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; |
