Checked!({short, ushort, byte, ubyte}, Throw): compilation fails
    Simen Kjærås 
    simen.kjaras at gmail.com
       
    Fri Apr 17 12:59:20 UTC 2020
    
    
  
On Friday, 17 April 2020 at 08:59:19 UTC, kdevel wrote:
> On Friday, 17 April 2020 at 04:29:06 UTC, Meta wrote:
>> Unlike C/C++, char is not a numeric type in D; It's a UTF-8 
>> code point:
>
> Thanks, it's a code /unit/. main reads now:
>
> void main ()
> {
>    bar!ubyte;
>    bar!byte;
>    bar!ushort;
>    bar!short;
>    bar!uint;
>    bar!int;
>    bar!ulong;
>    bar!long;
> }
>
> and dmd complains:
The problem is, short/short gives an int answer:
unittest {
     import std.experimental.checkedint;
     Checked!(short, Throw) a;
     pragma(msg, typeof(a/a));
}
So, in your code you get this situation:
unittest {
     import std.experimental.checkedint;
     Checked!(int, Throw) a;
     Checked!(short, Throw) b = a;
}
And assigning from an int to a short may discard data, so it's 
statically disallowed by Checked. This is a deliberate design 
choice, and the appropriate way to handle it is with a cast:
unittest {
     import std.experimental.checkedint;
     Checked!(int, Throw) a = 65535;
     Checked!(short, Throw) b = cast(short)a;
}
The above code will throw when casting (before the assignment), 
because 65535 can't fit in a short.
You also get a deprecation message, about an integral promotion 
not being performed. I believe the result is correct and the 
warning can be ignored.
--
   Simen
    
    
More information about the Digitalmars-d-learn
mailing list