On Mon, Dec 23, 2013 at 04:12:05PM -0800, Charles Hixson wrote: > On 12/23/2013 12:39 PM, David Held wrote: [...] > >int mightUpdate(int& x) > >{ > > ... > > return x; > >} > > > >{ > > ... > > a[mightUpdate(i)] = mightUpdate(i); > > ... > >} > > > >Is this also a bug? How would the compiler know whether to emit a > >diagnostic for this case? > > > >Dave > > > > > Yes, that should be an error. And the compiler could notice that the > function parameter values are allowed to be modified, and forbid such > use. As it should. After all, who's going to know which call would > modify the value of i? Of course, it could be protocol that the > functions included within the statement are all called before the > local values are calculated, and that if the same syntax appears > twice, the final value of the syntax is the value used...but that, > while reasonable for the compiler, is hell on people reading the code. > > Note that one can make several different plausible arguments as to > the order in which the code should be evaluated. When such is > possible, the code should be an error. And when it relies on rarely > used rules, it should probably be an error. (E.g., if you define > that the location into which values will be stored must be evaluated > before the expression to be stored is evaluated, you have a case > that would be well defined, but it's a "rare event" kind of rule, > and unless there's good reason, it should be an error.) [...]
Agreed. Note that introducing assignment into the mix may not help matters, but complicate them even more. For example: int x=1, y=0; writeln((y = ++x) + (++y--) * (x=y)); // what does this print? Or worse yet: int func1(int x) { ... } int func2(int x) { ... } int func3(int x) { ... } int function(int)[] funcptrs = [ &func1, &func2, &func3 ]; int x=0, y=0; y += funcptrs[++x--](y = --x++); // what does this do? The only place I can see where you'd even *want* to write code like this is in an entry to the IOCCC. Make it refuse to compile, I say. T -- "Holy war is an oxymoron." -- Lazarus Long