Thread overview
Operator implicit conversion difference
Nov 05, 2015
ixid
Nov 05, 2015
Ali Çehreli
Nov 07, 2015
BBaz
Nov 07, 2015
Ali Çehreli
Nov 07, 2015
BBaz
November 05, 2015
This may have been overlooked in my other thread so I wanted to ask again:

This seems very inconsistent, does a += b not lower to a = a + b? I guess not based on the below:

    ushort a = ushort.max, b = ushort.max;


    a += b; // Compiles fine
    a = a + b; // Error: cannot implicitly convert expression (cast(int)a + cast(int)b) of type int to ushort
November 05, 2015
On 11/05/2015 05:20 AM, ixid wrote:

> This seems very inconsistent, does a += b not lower to a = a + b?

Apparently not:

  http://dlang.org/expression.html#AssignExpression

It says "The right operand is implicitly converted to the type of the left operand". So, the rules are different.

Ali

November 07, 2015
On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:
> This may have been overlooked in my other thread so I wanted to ask again:
>
> This seems very inconsistent, does a += b not lower to a = a + b? I guess not based on the below:
>
>     ushort a = ushort.max, b = ushort.max;
>
>
>     a += b; // Compiles fine
>     a = a + b; // Error: cannot implicitly convert expression (cast(int)a + cast(int)b) of type int to ushort

What's inconsistent is the integral promotion of the add expression result that stops from 4 bytes int:

---
int a, b;
a += b;
a = a + b;
---

is compiled but according to the specs, a + b result should be widened to long:

http://dlang.org/expression.html#AddExpression

(ubyte, byte) until (uint int) should be widened and (long , ulong) wrapped. This behavior would match the specs better.
November 07, 2015
On 11/06/2015 04:56 PM, BBaz wrote:
> On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:
>> This may have been overlooked in my other thread so I wanted to ask
>> again:
>>
>> This seems very inconsistent, does a += b not lower to a = a + b? I
>> guess not based on the below:
>>
>>     ushort a = ushort.max, b = ushort.max;
>>
>>
>>     a += b; // Compiles fine
>>     a = a + b; // Error: cannot implicitly convert expression
>> (cast(int)a + cast(int)b) of type int to ushort
>
> What's inconsistent is the integral promotion of the add expression
> result that stops from 4 bytes int:
>
> ---
> int a, b;
> a += b;
> a = a + b;
> ---
>
> is compiled but according to the specs, a + b result should be widened
> to long:
>
> http://dlang.org/expression.html#AddExpression
>
> (ubyte, byte) until (uint int) should be widened and (long , ulong)
> wrapped. This behavior would match the specs better.

You say 'long' but according to integer promotions, a and b should both be promoted to 'int' and the result of 'a + b' is int:

  http://dlang.org/type.html#integer-promotions

Ali

November 07, 2015
On Saturday, 7 November 2015 at 01:10:01 UTC, Ali Çehreli wrote:
> On 11/06/2015 04:56 PM, BBaz wrote:
>> On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:
>>> [...]
>>
>> What's inconsistent is the integral promotion of the add expression
>> result that stops from 4 bytes int:
>>
>> ---
>> int a, b;
>> a += b;
>> a = a + b;
>> ---
>>
>> is compiled but according to the specs, a + b result should be widened
>> to long:
>>
>> http://dlang.org/expression.html#AddExpression
>>
>> (ubyte, byte) until (uint int) should be widened and (long , ulong)
>> wrapped. This behavior would match the specs better.
>
> You say 'long' but according to integer promotions, a and b should both be promoted to 'int' and the result of 'a + b' is int:
>
>   http://dlang.org/type.html#integer-promotions
>
> Ali

oh...sorry I thought that the widening was done to the follwing type that's bigger, eg byte->short, short->int.

So no inconsistence at all.