+ case CALL_EXPR:
+ /* Transform 'a = f();' to 'f(&a), a' if f returns in memory. */
+ if (aggregate_value_p (*from_p, *from_p))
+ {
+ tree arg;
+ if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (*from_p))
+ abort ();
+
+ ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue,
+ fb_lvalue);
+ if (ret == GS_ERROR)
+ return ret;
+
+ arg = build_fold_addr_expr (*to_p);
+ arg = tree_cons (NULL_TREE, arg, TREE_OPERAND (*from_p, 1));
+ TREE_OPERAND (*from_p, 1) = arg;
+ CALL_EXPR_HAS_RETURN_SLOT_ADDR (*from_p) = 1;
+ /* Don't warn about an unused return value. */
+ TREE_USED (*from_p) = 1;
+
+ if (want_value)
+ {
+ gimplify_and_add (*from_p, pre_p);
+ *expr_p = *to_p;
+ }
+ else
+ *expr_p = *from_p;
+ return GS_OK;
+ }
+ else
+ ret = GS_UNHANDLED;
+ break;
+