Please tell me this is a bug?
Peter Alexander via Digitalmars-d
digitalmars-d at puremagic.com
Sun Feb 22 06:18:22 PST 2015
On Sunday, 22 February 2015 at 07:11:24 UTC, deadalnix wrote:
> On Sunday, 22 February 2015 at 02:27:30 UTC, Peter Alexander
> wrote:
>> On Sunday, 22 February 2015 at 01:24:09 UTC, Almighty Bob
>> wrote:
>>> a += b; // Compiles with no ERROR!
>>>
>>> Please tell me that's a bug?
>>
>> Not a bug. From spec:
>>
>> http://dlang.org/expression.html#AssignExpression
>>> Assignment operator expressions, such as:
>>>
>>> a op= b
>>>
>>> are semantically equivalent to:
>>>
>>> a = cast(typeof(a))(a op b)
>>
>> Seems questionable to me. Anyone know the rationale? If a = b;
>> is disallowed, I don't see why a += b; should be more
>> acceptable.
>
> The rationale make sens for things like :
> byte a; a += 1;
>
> Here, because of type promotion, a + 1 is an int, and if VRP of
> a is unknown, you can't cast implicitly back to byte.
If VRP is unknown then it should be disallowed for precisely that
reason! It can't implicitly cast back to a byte, so it shouldn't.
If you know that the int fits in a byte then do the cast
yourself, that's what it's for.
> It is true that this create questionable side effect for float,
> but in the end, that is consistent, and it would be very
> annoying to not be able to increment/decrement integral smaller
> than int.
Even if you forget about float, it's still inconsistent.
byte a;
int b;
a = a + b;
a += b;
These do the same thing, and have the same pitfalls if the int is
too big. Both should be disallowed.
More information about the Digitalmars-d
mailing list