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.

Reply via email to