On Mon, Dec 3, 2018 at 4:36 PM Jakub Jelinek <ja...@redhat.com> wrote: > > On Mon, Dec 03, 2018 at 02:44:32PM -0500, Jason Merrill wrote: > > > > Is there a reason not to use the 'move' function here? > > > > > > That doesn't work at all. move doesn't call cp_convert, but > > > build_static_cast (though for the same reference && type). > > > But while cp_convert only adds NOP_EXPR around it, build_static_cast adds > > > a target_expr, addr_expr around that, nop_expr cast to the reference && > > > type > > > and finally indirect_ref that the caller doesn't expect, because it adds > > > it > > > by itself, e.g. in > > > 2424 if (temp) > > > 2425 object = cp_build_fold_indirect_ref (temp); > > > > So the caller is trying to take the address of the COND_EXPR, which should > > have POINTER_TYPE. And then indirecting that gives an lvalue, as it should. > > The bug is in the caller, build_class_member_access_expr. > > So like this then (if it passes bootstrap/regtest)? Seems to fix the > testcase. > > 2018-12-03 Jakub Jelinek <ja...@redhat.com> > > PR c++/88103 > * typeck.c (build_class_member_access_expr): If unary_complex_lvalue > turned xvalue_p into non-xvalue_p, call move on it. > > * g++.dg/cpp0x/rv-cond3.C: New test.
OK, thanks. Jason