[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