[Bug c++/70744] preincrements possibly double-evaluated in GNU ternaries
mpolacek at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Apr 21 16:42:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70744
--- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
So build_conditional_expr_1 has
4626 /* As a G++ extension, the second argument to the conditional can be
4627 omitted. (So that `a ? : c' is roughly equivalent to `a ? a :
4628 c'.) If the second operand is omitted, make sure it is
4629 calculated only once. */
4630 if (!arg2)
4631 {
...
4636 /* Make sure that lvalues remain lvalues. See g++.oliva/ext1.C.
*/
4637 if (real_lvalue_p (arg1))
4638 arg2 = arg1 = stabilize_reference (arg1);
4639 else
4640 arg2 = arg1 = save_expr (arg1);
4641 }
for preincrement_expr is real_lvalue_p true, so we go to stabilize_reference,
that should ensure that we can use the expr more times without causing its
operands to be evaluated more than once, but it doesn't know
{PRE,POST}{INCR,DECR}EMENT so does nothing:
4258 /* If arg isn't a kind of lvalue we recognize, make no change.
4259 Caller should recognize the error for an invalid lvalue. */
4260 default:
4261 return ref;
More information about the Gcc-bugs
mailing list