[Parser] Update CachedTokens while parsing ObjectiveC template argument list
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Sun, 31 Jan 2016 00:47:51 +0000 (00:47 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Sun, 31 Jan 2016 00:47:51 +0000 (00:47 +0000)
commit428a5aa9a5ff6ab0242c6813eaa0a39b87ea15ab
treebdafcb4b709e0bb05cb89a8eae7a17083a1e9a8e
parent054b391cf479b7bfda27c82b856a823d5b81aac6
[Parser] Update CachedTokens while parsing ObjectiveC template argument list

Consider the following ObjC++ snippet:

--
@protocol PA;
@protocol PB;

@class NSArray<ObjectType>;
typedef int some_t;

id<PA> FA(NSArray<id<PB>> *h, some_t group);
--

This would hit an assertion in the parser after generating an annotation token
while trying to update the token cache:

Assertion failed: (CachedTokens[CachedLexPos-1].getLastLoc() == Tok.getAnnotationEndLoc() && "The annotation should be until the most recent cached token")
...
7 clang::Preprocessor::AnnotatePreviousCachedTokens(clang::Token const&) + 494
8 clang::Parser::TryAnnotateTypeOrScopeTokenAfterScopeSpec(bool, bool, clang::CXXScopeSpec&, bool) + 1163
9 clang::Parser::TryAnnotateTypeOrScopeToken(bool, bool) + 361
10 clang::Parser::isCXXDeclarationSpecifier(clang::Parser::TPResult, bool*) + 598
...

The cached preprocessor token in this case is:

greatergreater '>>' Loc=<testcase.mm:7:24>

while the annotation ("NSArray<id<PB>>") ends at "testcase.mm:7:25", hence the
assertion.

Properly update the CachedTokens during template parsing to contain
two greater tokens instead of a greatergreater.

Differential Revision: http://reviews.llvm.org/D15173

rdar://problem/23494277

llvm-svn: 259311
clang/include/clang/Lex/Preprocessor.h
clang/lib/Lex/PPCaching.cpp
clang/lib/Parse/ParseTemplate.cpp
clang/test/Parser/objcxx11-protocol-in-template.mm