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. For example
foo() + foo();
shouldn't compile, unless + is an overloaded operator with 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