[Parser] Perform CachedTokens update dependent on token consumption

In the context where we break one tok::greatergreater into two
tok::greater in order to correctly update the cached tokens; update the
CachedTokens with two tok::greater only if ParseGreaterThanInTemplateList
clients asks to consume the last token. Otherwise we only need to add
one because the second is already added later on, as a not yet cached token.

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

rdar://problem/24488367

llvm-svn: 259910
This commit is contained in:
Bruno Cardoso Lopes 2016-02-05 19:36:39 +00:00
parent 98762d2429
commit fb9b6cd24b
2 changed files with 21 additions and 2 deletions

View File

@ -855,8 +855,12 @@ bool Parser::ParseGreaterThanInTemplateList(SourceLocation &RAngleLoc,
RemainingToken == tok::greater && PP.IsPreviousCachedToken(PrevTok)) {
PrevTok.setKind(RemainingToken);
PrevTok.setLength(1);
Token NewToks[] = {PrevTok, Tok};
PP.ReplacePreviousCachedToken(NewToks);
// Break tok::greatergreater into two tok::greater but only add the second
// one in case the client asks to consume the last token.
if (ConsumeLastToken)
PP.ReplacePreviousCachedToken({PrevTok, Tok});
else
PP.ReplacePreviousCachedToken({PrevTok});
}
if (!ConsumeLastToken) {

View File

@ -0,0 +1,15 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
template<class T> class vector {};
@protocol P @end
// expected-no-diagnostics
template <typename Functor> void F(Functor functor) {}
// Test protocol in template within lambda capture initializer context.
void z() {
id<P> x = 0;
(void)x;
F( [ x = vector<id<P>>{} ] {} );
}