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.


Reply via email to