[cfe-commits] r106214 - /cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Sat Jun 19 13:07:15 PDT 2010


On Jun 18, 2010, at 5:40 PM, Douglas Gregor wrote:

> 
> On Jun 17, 2010, at 3:52 AM, Argiris Kirtzidis wrote:
> 
>> Author: akirtzidis
>> Date: Thu Jun 17 05:52:22 2010
>> New Revision: 106214
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=106214&view=rev
>> Log:
>> Make sure the caching mechanism in Parser::ParseLexedMethodDefs is robust against the parser reading too few tokens.
>> 
>> Modified:
>>   cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
>> 
>> Modified: cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp?rev=106214&r1=106213&r2=106214&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp Thu Jun 17 05:52:22 2010
>> @@ -216,8 +216,10 @@
>>      assert(!PP.getSourceManager().isBeforeInTranslationUnit(origLoc,
>>                                                           Tok.getLocation()) &&
>>             "ParseFunctionTryBlock went over the cached tokens!");
>> -      assert(Tok.getLocation() == origLoc &&
>> -             "ParseFunctionTryBlock left tokens in the token stream!");
>> +      // There could be leftover tokens (e.g. because of an error).
>> +      // Skip through until we reach the original token position.
>> +      while (Tok.getLocation() != origLoc)
>> +        ConsumeAnyToken();
>>      continue;
>>    }
>>    if (Tok.is(tok::colon)) {
>> @@ -233,8 +235,18 @@
>> 
>>    ParseFunctionStatementBody(LM.D);
>> 
>> -    // FIXME:  We need to make sure the caching mechanism here is robust
>> -    //  against the parser reading too few token
>> +    if (Tok.getLocation() != origLoc) {
>> +      // Due to parsing error, we either went over the cached tokens or
>> +      // there are still cached tokens left. If it's the latter case skip the
>> +      // leftover tokens.
>> +      // Since this is an uncommon situation that should be avoided, use the
>> +      // expensive isBeforeInTranslationUnit call.
>> +      if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(),
>> +                                                          origLoc))
>> +        while (Tok.getLocation() != origLoc)
>> +          ConsumeAnyToken();
>> +
>> +    }
>>  }
> 
> I would sleep better at night if this while loop also had a Tok.isNot(tok::eof) check.

Done on r106394.

-Argiris



More information about the cfe-commits mailing list