I have the following programme

import std.stdio;

bool isDigit(char c) nothrow
{
        return c >= '0' && c <= '9';
}

ushort hexValue(char c) nothrow
{
        if( isDigit(c) )
                return c - '0';
        else if (c >= 'a' && c <= 'f')
                return c - 'a' + 10;
        else if (c >= 'A' && c <= 'F')
                return c - 'A' + 10;
        else
                return ushort.max;
}


void main()
{
        writeln(hexValue('A')); 
}

This example is compiling successfully in DMD 2.064 but in DMD 2.065 a got the following error:

/d544/f547.d(12): Error: cannot implicitly convert expression (cast(int)c - 48) of type int to ushort /d544/f547.d(14): Error: cannot implicitly convert expression (cast(int)c - 97 + 10) of type int to ushort /d544/f547.d(16): Error: cannot implicitly convert expression (cast(int)c - 65 + 10) of type int to ushort

So I have a question why these expressions are casted to int? I was thinking that result should be of char type. And it could be implicitly converted to ushort (because there is enough place to store result). Is it a bug in compiler or I should insert explicit casts?

Reply via email to