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.