[Issue 21359] New: The D spec doesn't talk about that Undefined Behaviour
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Nov 3 12:53:42 UTC 2020
https://issues.dlang.org/show_bug.cgi?id=21359
Issue ID: 21359
Summary: The D spec doesn't talk about that Undefined Behaviour
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: aliloko at gmail.com
Original report: https://github.com/ldc-developers/ldc/issues/3603
# SPEC CHANGE
The specification that I feel is incomplete is 10.18.4.7
https://dlang.org/spec/expression.html#cast_expressions
It should says precisely:
- Casting float values outside [-X , X] to int is illegal.
- Casting double values outside [-Y , Y] to int is illegal.
- Casting float values outside [-Z , Z] to long is illegal.
- Casting double values outside [-W , W] to long is illegal.
(different behaviour for unsigned?)
With proper values for X, Y, Z, W.
# PROOF
Consider the following program:
```d
import core.stdc.stdio;
void main(string[] args)
{
double d = 625935085.258525;
uint msu = cast(uint)(d * 1000.0);
printf("msu = %d\n", msu);
printf("msu at CTFE = %d\n", ctfeResult_uint);
int msi = cast(int)(d * 1000.0);
printf("msi = %d\n", msi);
printf("msi at CTFE = %d\n", ctfeResult_int);
// and the CTFE ones?
}
enum uint ctfeResult_uint = cast(uint)(625935085.258525 * 1000.0);
enum int ctfeResult_int = cast(int)(625935085.258525 * 1000.0);
```
In LDC x86_64 the output is:
```d
msu = -1130139958
msu at CTFE = -1130139958
msi = -2147483648
msi at CTFE = -2147483648
```
In LDC arm64 the output is:
```d
msu = -1
msu at CTFE = -1130139958
msi = 2147483647
msi at CTFE = -2147483648
```
The ARM FCVTZ instruction doesn't work like the x86 CVTSI2SS instruction with
regards to out-of-bounds floats.
--
More information about the Digitalmars-d-bugs
mailing list