On Mon, May 1, 2017 at 8:05 PM, Mikhail Maltsev <malts...@gmail.com> wrote:
> This bug happens when the LHS of operator '->' is either missing, i.e.:
>
> (->a) = 0;
>
> or it is not a pointer:
>
> int b;
> b_2->c = 0;
>
> LHS should be validated.

I think for the missing LHS it's better to simply not generate code
when expr is in error
state like with

Index: gcc/c/gimple-parser.c
===================================================================
--- gcc/c/gimple-parser.c       (revision 247542)
+++ gcc/c/gimple-parser.c       (working copy)
@@ -968,6 +968,8 @@ c_parser_gimple_postfix_expression_after
                break;
              }

+           if (expr.value == error_mark_node)
+             break;
            start = expr.get_start ();
            finish = c_parser_tokens_buf (parser, 0)->location;
            expr.value = build_array_ref (op_loc, expr.value, idx);
@@ -986,6 +988,8 @@ c_parser_gimple_postfix_expression_after
              c_parser_gimple_expr_list (parser, &exprlist);
            c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
                                       "expected %<)%>");
+           if (expr.value == error_mark_node)
+             break;
            expr.value = build_call_array_loc
                (expr_loc, TREE_TYPE (TREE_TYPE (expr.value)),
                 expr.value, exprlist.length (), exprlist.address ());
@@ -1014,6 +1018,8 @@ c_parser_gimple_postfix_expression_after
            start = expr.get_start ();
            finish = c_parser_peek_token (parser)->get_finish ();
            c_parser_consume_token (parser);
+           if (expr.value == error_mark_node)
+             break;
            expr.value = build_component_ref (op_loc, expr.value, ident,
                                              comp_loc);
            set_c_expr_source_range (&expr, start, finish);
@@ -1052,6 +1058,8 @@ c_parser_gimple_postfix_expression_after
            start = expr.get_start ();
            finish = c_parser_peek_token (parser)->get_finish ();
            c_parser_consume_token (parser);
+           if (expr.value == error_mark_node)
+             break;
            expr.value = build_component_ref (op_loc,
                                              build_simple_mem_ref_loc
                                                (op_loc, expr.value),

it'll also get us some error recovery compared to stop parsing earlier.

So maybe you can factor out the "missing op" case from this and the
DOT case, doing
the above?

Then handle callers of build_simple_mem_ref_loc to add sanity checking
that we've
dereferencing a pointer.

Thanks,
Richard.

> --
> Regards,
>    Mikhail Maltsev
>
> gcc/testsuite/ChangeLog:
>
> 2017-05-01  Mikhail Maltsev  <malts...@gmail.com>
>
>         * gcc.dg/gimplefe-error-6.c: New test.
>         * gcc.dg/gimplefe-error-7.c: New test.
>
>
> gcc/c/ChangeLog:
>
> 2017-05-01  Mikhail Maltsev  <malts...@gmail.com>
>
>         * gimple-parser.c (c_parser_gimple_postfix_expression_after_primary):
>         Check LHS of operator '->'
>
>

Reply via email to