On Tue, Jan 07, 2014 at 02:27:04PM +0100, Florian Weimer wrote: > gimplify_modify_expr_rhs, in the CALL_EXPR case: > > if (use_target) > { > CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1; > mark_addressable (*to_p); > }
Yeah, that sets it in some cases too, not in other testcases. Just look at how the flag is used when actually expanding it: if (target && MEM_P (target) && CALL_EXPR_RETURN_SLOT_OPT (exp)) structure_value_addr = XEXP (target, 0); else { /* For variable-sized objects, we must be called with a target specified. If we were to allocate space on the stack here, we would have no way of knowing when to free it. */ rtx d = assign_temp (rettype, 1, 1); structure_value_addr = XEXP (d, 0); target = 0; } so, if it is set, the address of the var on the LHS is passed to the function as hidden argument, if it is not set, we pass address of a stack temporary instead. Both the automatic var and the stack temporary can overflow, if the callee does something wrong. Jakub