[cfe-commits] [PATCH] PR4111, PR5925, PR13210: Make tentative parsing smarter in the presence of undeclared identifiers
Sean Silva
silvas at purdue.edu
Fri Jul 13 00:19:24 PDT 2012
If you're waiting on me, go ahead. My suggestion was just a "peephole"
suggestion.
--Sean Silva
On Thu, Jul 12, 2012 at 9:18 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> Patch rebased to ToT.
>
>
> On Sun, Jul 8, 2012 at 2:11 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>>
>> Ping.
>>
>>
>> On Fri, Jun 29, 2012 at 12:49 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>>>
>>> On Fri, Jun 29, 2012 at 11:46 AM, Sean Silva <silvas at purdue.edu> wrote:
>>>>
>>>> + case ANK_TentativeDecl:
>>>> + case ANK_TemplateName:
>>>> + // These two shouldn't happen.
>>>> + case ANK_Unresolved:
>>>> break;
>>>>
>>>> assert?
>>>
>>>
>>> Sorry, I forgot to update that comment after some refactoring. The second
>>> case is possible (but only for ill-formed code), and the first case is
>>> completely harmless. I've updated and simplified this code to remove the
>>> switch entirely:
>>>
>>> case tok::identifier: {
>>> Token Next = NextToken();
>>> if (Next.is(tok::colon)) { // C99 6.8.1: labeled-statement
>>> // identifier ':' statement
>>> return ParseLabeledStatement(Attrs);
>>> }
>>>
>>> // Look up the identifier, and typo-correct it to a keyword if it's
>>> not
>>> // found.
>>> if (Next.isNot(tok::coloncolon)) {
>>> // CorrectionCandidateCallback by default allows typo-correction to
>>> // anything which can appear at the start of a statement.
>>> CorrectionCandidateCallback DefaultValidator;
>>> if (TryAnnotateName(/*IsAddressOfOperand*/false, &DefaultValidator)
>>> == ANK_Error) {
>>> // Handle errors here by skipping up to the next semicolon or
>>> '}', and
>>> // eat the semicolon if that's what stopped us.
>>> SkipUntil(tok::r_brace, /*StopAtSemi=*/true,
>>> /*DontConsume=*/true);
>>> if (Tok.is(tok::semi))
>>> ConsumeToken();
>>> return StmtError();
>>> }
>>>
>>> // If the identifier was typo-corrected, try again.
>>> if (Tok.isNot(tok::identifier))
>>> goto Retry;
>>> }
>>>
>>> // Fall through
>>> }
>>>
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list