The regression suite, files
systemc-regressions-2.3.1a/tests/systemc/datatypes/fx/constructors/array.cpp
systemc-regressions-2.3.1a/tests/systemc/datatypes/fx/fast_constructors/array.cpp
systemc-regressions-2.3.1a/tests/systemc/datatypes/misc/test02/test02.cpp
invoke undefined behaviour by converting out-of-range doubles to unsigned integers directly. This is undefined in the C++ standard
See http://stackoverflow.com/a/4752947/1763356 for further information.
This happens multiple most prominently in the code
sc_fxval *b = new sc_fxval[4];
b[0] = (ushort)-1;
for (i = 1; i < 4; ++i)
b[i] = (ushort)(b[i-1] * i * -1);
where negative doubles are converted to unsigned shorts, because sc_fxval only has conversions to double. It is unclear whether the test is correct and sc_fxval wrong, or vice-versa. If the later, one can avoid undefined behaviour by indirecting through a sufficiently large signed type.
sc_fxval *b = new sc_fxval[4];
b[0] = (ushort)-1;
for (i = 1; i < 4; ++i)
b[i] = (ushort)(int64)(b[i-1] * i * -1);
I was caught by this issue when testing a build of SystemC for AArch64, as part of a port I am making. As an aside, how (and where) should I attempt to upstream my port when it is ready?