Should this be flagged as a warning?

Timon Gehr timon.gehr at gmx.ch
Wed Sep 26 05:19:53 PDT 2012


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.
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.

> It would be really interesting to add this check, and then compile
> existing code (such as Phobos) to see if it breaks valid code, or
> reveals bugs.
>



More information about the Digitalmars-d mailing list