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

Reply via email to