On Wed, Mar 21, 2018 at 6:26 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Tue, Mar 20, 2018 at 05:58:43PM -0400, Jason Merrill wrote: >> On Tue, Mar 20, 2018 at 5:04 PM, Jakub Jelinek <ja...@redhat.com> wrote: >> > --- gcc/cp/semantics.c.jj 2018-03-20 11:58:17.069356145 +0100 >> > +++ gcc/cp/semantics.c 2018-03-20 21:56:43.745292245 +0100 >> > @@ -1512,6 +1512,26 @@ finish_asm_stmt (int volatile_p, tree st >> > && C_TYPE_FIELDS_READONLY (TREE_TYPE (operand))))) >> > cxx_readonly_error (operand, lv_asm); >> > >> > + tree *op = &operand; >> > + while (TREE_CODE (*op) == COMPOUND_EXPR) >> > + op = &TREE_OPERAND (*op, 1); >> > + switch (TREE_CODE (*op)) >> > + { >> > + case PREINCREMENT_EXPR: >> > + case PREDECREMENT_EXPR: >> > + case MODIFY_EXPR: >> > + if (TREE_SIDE_EFFECTS (TREE_OPERAND (*op, 0))) >> > + *op = build2 (TREE_CODE (*op), TREE_TYPE (*op), >> > + cp_stabilize_reference (TREE_OPERAND (*op, >> > 0)), >> > + TREE_OPERAND (*op, 1)); >> > + *op = build2 (COMPOUND_EXPR, TREE_TYPE (*op), *op, >> > + TREE_OPERAND (*op, 0)); >> > + op = &TREE_OPERAND (*op, 1); >> > + break; >> > + default: >> > + break; >> > + } >> >> Hmm, it would be nice to share this with the similar patterns in >> unary_complex_lvalue and cp_build_modify_expr.
> You mean just outline the > if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0))) > lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs), > cp_stabilize_reference (TREE_OPERAND (lhs, 0)), > TREE_OPERAND (lhs, 1)); > lhs = build2 (COMPOUND_EXPR, lhstype, lhs, TREE_OPERAND (lhs, 0)); > into lhs = some_function (lhs); and use that in finish_asm_stmt, > unary_complex_lvalue and cp_build_modify_expr in these spots? > I really have no idea how to commonize anything else, e.g. the COMPOUND_EXPR > handling is substantially different between the 3 functions. > Any suggestion for the some_function name if you want that? Sure, that's something. How about genericize_compound_lvalue? Jason