Implicit integer conversions Before Preconditions

Steven Schveighoffer schveiguy at gmail.com
Tue May 24 21:05:00 UTC 2022


On 5/24/22 4:46 PM, jmh530 wrote:
> In the code below, `x` and `y` are implicitly converted to `uint` and 
> `ushort` before the function preconditions are run.
> 
> Is there any way to change this behavior? It feels unintuitive and I 
> can't find in the spec where it says when the conversions in this case 
> occur, but it clearly happens before the preconditions are run.
> 
> ```d
> import std.stdio: writeln;
> 
> void foo(uint x)
>      in (x >= 0)
> {
>      writeln(x);
> }
> 
> void foo(ushort x)
>      in (x >= 0)
> {
>      writeln(x);
> }
> 
> void main() {
>      int x = -1;
>      foo(x); //prints 4294967295
>      short y = -1;
>      foo(y); //prints 65535
> }
> ```

```d
// e.g.
foo(int x)
in (x >= 0)
{
    return foo(uint(x));
}
```

And remove those useless `in` conditions on the unsigned versions, an 
unsigned variable is always >= 0.

-Steve


More information about the Digitalmars-d-learn mailing list