public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Mikhail Maltsev <maltsevm@gmail.com>
Cc: gcc-patches <gcc-patches@gnu.org>,
		Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Subject: Re: [PATCH 1/5][GIMPLE FE] PR testsuite/80580. Handle missing labels in goto statements
Date: Tue, 30 May 2017 11:50:00 -0000	[thread overview]
Message-ID: <CAFiYyc12Or7daW04BLcP2f85SPbnJuuTdJC9-Xa5teQbPeCXHg@mail.gmail.com> (raw)
In-Reply-To: <CAFiYyc2AmRC4UZHWkc_VX613FhXa5vYGkei8y3f_=ygb+g5+1g@mail.gmail.com>

On Tue, May 30, 2017 at 1:46 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Mon, May 29, 2017 at 6:38 AM, Mikhail Maltsev <maltsevm@gmail.com> wrote:
>> Hi. Sorry for a long delay.
>>
>> On 02.05.2017 17:16, Richard Biener wrote:
>>> Certainly an improvement.  I suppose we can do better error recovery
>>> for cases like
>>>
>>>  if (1)
>>>    goto
>>>  else
>>>    goto bar;
>>>
>>> but I guess this is better than nothing.
>> I think it's worth spending a bit more time to get this right.
>>
>>>
>>> And yes, we use c_parser_error -- input_location should be ok but here
>>> we just peek which may upset the parser.  Maybe it works better
>>> when consuming the token before issueing the error?  Thus
>>>
>>> Index: gcc/c/gimple-parser.c
>>> ===================================================================
>>> --- gcc/c/gimple-parser.c       (revision 247498)
>>> +++ gcc/c/gimple-parser.c       (working copy)
>>> @@ -1315,8 +1315,8 @@ c_parser_gimple_if_stmt (c_parser *parse
>>>        loc = c_parser_peek_token (parser)->location;
>>>        c_parser_consume_token (parser);
>>>        label = c_parser_peek_token (parser)->value;
>>> -      t_label = lookup_label_for_goto (loc, label);
>>>        c_parser_consume_token (parser);
>>> +      t_label = lookup_label_for_goto (loc, label);
>>>        if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
>>>         return;
>>>      }
>>>
>> I was more focused on cases with missing labels (i.e. 'label' is NULL), rather
>> than cases with syntactically correct if-statements referencing undefined
>> labels. And, frankly speaking, I'm not sure that swapping
>> 'c_parser_consume_token' with 'lookup_label_for_goto' will help, because
>> 'lookup_label_for_goto' already gets a 'loc' parameter.
>
> Ah, indeed.
>
>> BTW, unfortunately GIMPLE FE does not handle undefined labels properly. I.e.,
>> this test case
>>
>> __GIMPLE() void foo()
>> {
>> bb_0:
>>   if (0)
>>     goto bb_0;
>>   else
>>     goto bb_1;
>> }
>>
>> causes an ICE somewhere in build_gimple_cfg/cleanup_dead_labels. But this is a
>> separate issue, of course.
>
> Yes.  I think ICEing for invalid GIMPLE (as opposed for syntactic
> errors) is OK for now.
>
>> I attached a slightly modified patch, which incorporates your changes and also uses
>>
>>   if (! c_parser_next_token_is (parser, CPP_NAME))
>>     ...
>>
>> instead of
>>
>>   label = c_parser_peek_token (parser)->value;
>>   ...
>>   if (!label)
>>     ...
>>
>> for better readability. This version correctly handles missing labels and
>> semicolons in both branches of the 'if' statement.
>>
>> The only major problem, which I want to fix is error recovery in the following
>> example:
>>
>> __GIMPLE() void foo()
>> {
>>   if (1)
>>     goto lbl;
>>   else
>>     goto ; /* { dg-error "expected label" } */
>> }
>>
>> __GIMPLE() void bar()
>> {
>>   if (1)
>>     goto lbl;
>>   else
>>     goto
>> } /* { dg-error "expected label" } */
>>
>> In this case GCC correctly diagnoses both errors. But if I swap these two
>> functions so that 'bar' comes before 'foo', the error in 'foo' is not diagnosed.
>> I did not dive into details, but my speculation is that the parser  enters some
>> strange state and skips 'foo' entirely (-fdump-tree-gimple contains only 'bar').
>> If I add another function after 'foo', it is handled correctly.
>> Any ideas, why this could happen and how to improve error recovery in this case?
>
> Huh.  I suppose this is due to us testing c_parser_error () to skip
> tokens in some places and
> not clearing it after (successfully) ending parsing of a function.
>
> Not sure where clearing of parser->error happens usually, it somewhat
> looks like it has
> to be done manually somewhere up in the callstack (I suppose once we managed to
> "recover").  Most c_parser_skip* routines clear error for example.

Oh, and the patch you posted is ok.

Thanks,
Richard.

> Richard.
>
>>
>> --
>> Regards,
>>    Mikhail Maltsev

      reply	other threads:[~2017-05-30 11:47 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-01 18:04 Mikhail Maltsev
2017-05-02 14:21 ` Richard Biener
2017-05-29  5:04   ` Mikhail Maltsev
2017-05-30 11:47     ` Richard Biener
2017-05-30 11:50       ` Richard Biener [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAFiYyc12Or7daW04BLcP2f85SPbnJuuTdJC9-Xa5teQbPeCXHg@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=gcc-patches@gnu.org \
    --cc=maltsevm@gmail.com \
    --cc=prathamesh.kulkarni@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).