*walk_subtrees = 0;
/* Change all returns to just refer to the RESULT_DECL; this is a nop,
but differs from using NULL_TREE in that it indicates that we care
- about the value of the RESULT_DECL. */
+ about the value of the RESULT_DECL. But preserve anything appended
+ by check_return_expr. */
else if (TREE_CODE (*tp) == RETURN_EXPR)
- TREE_OPERAND (*tp, 0) = dp->result;
+ {
+ tree *p = &TREE_OPERAND (*tp, 0);
+ while (TREE_CODE (*p) == COMPOUND_EXPR)
+ p = &TREE_OPERAND (*p, 0);
+ gcc_checking_assert (TREE_CODE (*p) == INIT_EXPR
+ && TREE_OPERAND (*p, 0) == dp->result);
+ *p = dp->result;
+ }
/* Change all cleanups for the NRV to only run when an exception is
thrown. */
else if (TREE_CODE (*tp) == CLEANUP_STMT