September 19, 2012
runnable/constfold.d contains the following test case:

---
void test2()
{
    float f = float.infinity;
    int i = cast(int) f;
    writeln(i);
    writeln(cast(int)float.max);
    assert(i == cast(int)float.max);
    assert(i == 0x80000000);
}
---

Is it really valid, i.e. is the result of the cast really defined?

I didn't look up the correct behavior in the C standard, but interestingly both GCC and Clang (i.e. the LLVM constant folder) produce int.min in unoptimized builds but int.max in optimized builds of the following program:

---
#include <iostream>
#include <limits>

int main(int argc, char const *argv[])
{
    std::cout <<
static_cast<int>(std::numeric_limits<float>::infinity()) << std::endl;
    return 0;
}
---

Can somebody shed light on the issue?

David
_______________________________________________
dmd-internals mailing list
dmd-internals@puremagic.com
http://lists.puremagic.com/mailman/listinfo/dmd-internals