Walter Bright wrote: > writing generic code so that the same code can be generated for void > and non-void return values. http://d.puremagic.com/issues/show_bug.cgi?id=5399 (cited 01/02/11)
The docs include: | Expressions that have no effect, like (x + x), are illegal in | expression statements. If such an expression is needed, casting it to | void will make it legal. http://www.digitalmars.com/d/2.0/statement.html#ExpressionStatement | If the Expression has no side effects, and the return type is void, | then it is illegal. http://www.digitalmars.com/d/2.0/statement.html#ReturnStatement ( both cited 01/02/11) Walters remark suggests that the dysmorphism between returnStatement and expressionStatement is based on arbitrariness: generating an expression by generic code must still take into account, whether the genrated expression will be used for an expressionStatement or a returnStatement. This is because casting to void will not legalize an expression without side effects for a returnStatement, but for an expressionStatement only. To make this homomorphic it might be adequate to view returning as an attribute of an expressionStatement: `(void).return;' instead of `return;' whithin `void f(){}' `(1).return;' instead of `return 1;' whithin `int f(){}' and `(cast(void) 1).return;' whitin `void f(){}' to make returning a constant to void as legal as using a constant as an expression: `cast(void) 1;'. -manfred
