rsmith added a subscriber: rsmith. rsmith requested changes to this revision. rsmith added a reviewer: rsmith. rsmith added a comment. This revision now requires changes to proceed.
I think that this will leave us with a broken token stream. In your example, the cached token stream starts as `NSArray` `<` `id` `<` `PB` `>>` `*` [...] ... and we try to annotate the `id<PB>` with our `CachedLexPos` pointing at the `*` token. That leaves `CachedTokens` containing: `NSArray` `<` `(type annotation)` `*` [...] ... which is wrong. We need to actually convert the `tok::greatergreater` in `CachedTokens` into a `tok::greater` and update its location and length in order for the cached token stream to be correctly updated. Otherwise if the parser backtracks it will see the wrong token stream. ================ Comment at: lib/Lex/PPCaching.cpp:102-104 @@ +101,5 @@ +#ifndef NDEBUG + Token CachedLastTok = CachedTokens[CachedLexPos - 1]; + SourceLocation CachedLastTokLoc = CachedLastTok.getLastLoc(); + SourceLocation TokAnnEndLoc = Tok.getAnnotationEndLoc(); + ---------------- Please add braces inside this #ifndef block so these variables don't accidentally leak into the rest of the function. ================ Comment at: lib/Lex/PPCaching.cpp:108 @@ +107,3 @@ + // `Tok` length could be bigger than one (e.g. greatergreater '>>'), account + // for that cases before checking the assertion. + if (!CachedLastTok.isAnnotation()) { ---------------- that cases -> that case ================ Comment at: lib/Lex/PPCaching.cpp:109 @@ +108,3 @@ + // for that cases before checking the assertion. + if (!CachedLastTok.isAnnotation()) { + CachedLastTokLoc = ---------------- Please only do this extra work if `CachedLastTokLoc != TokAnnEndLoc`. http://reviews.llvm.org/D15173 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits