Annoyance with new integer promotion deprecations

Timon Gehr timon.gehr at gmx.ch
Mon Feb 5 23:18:58 UTC 2018


On 05.02.2018 22:56, Walter Bright wrote:
> On 2/5/2018 12:45 PM, H. S. Teoh wrote:
>> Sticking to C promotion rules is one of the scourges that continue to
>> plague D;
> 
> It's necessary. Working C expressions cannot be converted to D while 
> introducing subtle changes in behavior.
> ...

Neither byte nor dchar are C types.

>> another example is char -> byte confusion no thanks to C
>> traditions:
>>
>>     int f(dchar ch) { return 1; }
>>     int f(byte i) { return 2; }
>>     void main() {
>>         pragma(msg, f('a'));
>>         pragma(msg, f(1));
>>     }
>>
>> Exercise for reader: guess compiler output.
> 
> 'a' and 1 do not match dchar or byte exactly, and require implicit 
> conversions. D doesn't have the C++ notion of "better" implicit 
> conversions for function arguments, instead it uses the 
> "leastAsSpecialized" C++ notion used for template matching, which is 
> better.
> 
> The idea is a byte can be implicitly converted to a dchar, but not the 
> other way around. Hence, f(byte) is selected as being the "most 
> specialized" match.

The overloading rules are fine, but byte should not implicitly convert 
to char/dchar, and char should not implicitly convert to byte.


More information about the Digitalmars-d mailing list