> Why just for function arguments?

Function argument is the place that the expression is *actually used*, as like as the rhs of assignment. As far as I see, there is no other place with same characteristic. So it looks like a special case, but it isn't.

> `a[] * a[];`

The `discardValue` check would reject the case correctly (`Error: + has no effect in expression (a[] + a[])`).