Common type of ubyte and const ubyte is int
Timon Gehr
timon.gehr at gmx.ch
Wed May 1 14:55:16 UTC 2024
On 5/1/24 16:42, Steven Schveighoffer wrote:
> On Tuesday, 30 April 2024 at 21:18:36 UTC, Timon Gehr wrote:
>> On 4/30/24 20:19, Steven Schveighoffer wrote:
>>> ```d
>>> ubyte a;
>>> const(ubyte) b;
>>>
>>> auto x = true ? a : b;
>>>
>>> pragma(msg, typeof(x)); // int
>>> ```
>>>
>>> Why? This isn't a VRP problem, as both are `ubyte`.
>>>
>>> Related issue
>>>
>>> https://issues.dlang.org/show_bug.cgi?id=19817
>>>
>>> -Steve
>>
>> FWIW, my frontend says `ubyte` here and there is a comment somewhere
>> that claims it implements some rules from TDPL page 60.
>
> Thanks to phone OCR, this is what is on that page:
>
> ```
> 1. If a and b have the same type, T is that type;
> 2. else if a and b are integrals, first promote anything smaller than
> 32-bit to int, then choose T as the larger type, with a preference for
> unsigned type if tied in size;
> 3. else if one is an integral and the other is a floating-point type, T
> is the floating-point type;
> 4. else if both have floating-point types, T is the larger of the two;
> 5. else if the types have a common supertype (e.g., base class), T is
> that supertype (we will return to this topic in Chapter 6);
> 6. else try implicitly converting a to b's type and b to a's type; if
> exactly one of these succeeds, T is the type of the successful
> conversion target;
> 7. else the expression is in error.
> ```
> ...
Thanks! Did not have the book at hand myself.
> It seems rule 2 would apply instead of rule 6?
Indeed, I think technically DMD conforms to those rules, but my frontend
does not, on this example.
> but I don't like it.
>
> -Steve
Same. (Not biased.)
More information about the Digitalmars-d
mailing list