Should this be flagged as a warning?

Don Clugston dac at nospam.com
Wed Sep 26 06:09:13 PDT 2012


On 26/09/12 14:19, Timon Gehr wrote:
> On 09/26/2012 11:45 AM, Don Clugston wrote:
>> On 25/09/12 21:30, Bernard Helyer wrote:
>>> I tried to post this last night, but the NG wasn't having any of it.
>>>
>>> I found myself writing a bug that looked like this
>>>
>>>      match(ts, TokenType.Is);
>>>      match(ts, TokenType.OpenParen);
>>>      isExp.type == parseType(ts);
>>>
>>> The bug being of course, that a type is parsed and ts is modified,
>>> so the expression has side effects so it's not flagged as a useless
>>> expression. But the comparison still has no effect, so should this be
>>> flagged by DMD?
>>>
>>> -Bernard.
>>
>>
>> The "must have an effect" rule only applies to statements, not
>> expressions, so this is according to the spec. It's not a bug.
>>
>> This is a bit like the more extreme case I recently posted about:
>>
>> int x, y, z;
>> x == y, ++z;
>>
>> doesn't generate an error message even though x == y has no
>> side-effects, because comma is an expression, not a statement.
>>
>> IMHO, every expression should be required to have an effect.
>
> I'd rather restrict this to expressions whose value is unused.

If the value is used, it has an effect.

> Otherwise 'a = b is c;' will be illegal, because 'b is c' does not have
> an effect.
>
>> For example foo() + foo();
>> shouldn't compile, unless + is an overloaded operator
>
> Yes.
>
>> with side-effects.
>>
>
> Not sure about that. In generic code, it is possible and likely (as pure
> is inferred for lambdas and template functions) that a pure
> function ends up being called for potential side effects.

I wouldn't give it special treatment. I think it should be allowed if 
and only if

plus(foo(), foo());

compiles, when plus is pure nothrow.


More information about the Digitalmars-d mailing list