This PR shows that we generate wrong code with the x ?: y extension in case the
first operand contains either predecrement or preincrement. The problem is
that we don't emit SAVE_EXPR, thus the operand is evaluated twice, which it
should not be.
While ++i or --i can be lvalues in C++, i++ or i-- can not. The code in
build_conditional_expr_1 has:
4635 /* Make sure that lvalues remain lvalues. See g++.oliva/ext1.C. */
4636 if (real_lvalue_p (arg1))
4637 arg2 = arg1 = stabilize_reference (arg1);
4638 else
4639 arg2 = arg1 = save_expr (arg1);
so for ++i/--i we call stabilize_reference, but that doesn't know anything
about PREINCREMENT_EXPR or PREDECREMENT_EXPR and just returns the same
expression, so SAVE_EXPR isn't created.
I think one fix would be to teach stabilize_reference what to do with those,
similarly to how we handle COMPOUND_EXPR there.