[PATCH] D15173: [Preprocessor] Fix assertion in AnnotatePreviousCachedTokens
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 25 09:54:03 PST 2016
Ping!
On Wed, Jan 20, 2016 at 11:22 AM, Bruno Cardoso Lopes
<bruno.cardoso at gmail.com> wrote:
> bruno updated this revision to Diff 45421.
> bruno added a comment.
>
> Update patch after Richard comments
>
>
> http://reviews.llvm.org/D15173
>
> Files:
> include/clang/Lex/Preprocessor.h
> lib/Lex/PPCaching.cpp
> lib/Parse/ParseTemplate.cpp
> test/Parser/objcxx11-protocol-in-template.mm
>
> Index: test/Parser/objcxx11-protocol-in-template.mm
> ===================================================================
> --- test/Parser/objcxx11-protocol-in-template.mm
> +++ test/Parser/objcxx11-protocol-in-template.mm
> @@ -8,3 +8,11 @@
>
> vector<id<P>> v;
> vector<vector<id<P>>> v2;
> +
> + at protocol PA;
> + at protocol PB;
> +
> + at class NSArray<ObjectType>;
> +typedef int some_t;
> +
> +id<PA> FA(NSArray<id<PB>> *h, some_t group);
> Index: lib/Parse/ParseTemplate.cpp
> ===================================================================
> --- lib/Parse/ParseTemplate.cpp
> +++ lib/Parse/ParseTemplate.cpp
> @@ -827,6 +827,7 @@
> }
>
> // Strip the initial '>' from the token.
> + Token PrevTok = Tok;
> if (RemainingToken == tok::equal && Next.is(tok::equal) &&
> areTokensAdjacent(Tok, Next)) {
> // Join two adjacent '=' tokens into one, for cases like:
> @@ -843,6 +844,17 @@
> PP.getSourceManager(),
> getLangOpts()));
>
> + // The advance from '>>' to '>' in a ObjectiveC template argument list needs
> + // to be properly reflected in the token cache to allow correct interaction
> + // between annotation and backtracking.
> + if (ObjCGenericList && PrevTok.getKind() == tok::greatergreater &&
> + RemainingToken == tok::greater && PP.IsPreviousCachedToken(PrevTok)) {
> + PrevTok.setKind(RemainingToken);
> + PrevTok.setLength(1);
> + SmallVector<Token, 2> NewToks = {PrevTok, Tok};
> + PP.ReplacePreviousCachedToken(NewToks);
> + }
> +
> if (!ConsumeLastToken) {
> // Since we're not supposed to consume the '>' token, we need to push
> // this token and revert the current token back to the '>'.
> Index: lib/Lex/PPCaching.cpp
> ===================================================================
> --- lib/Lex/PPCaching.cpp
> +++ lib/Lex/PPCaching.cpp
> @@ -116,3 +116,27 @@
> }
> }
> }
> +
> +bool Preprocessor::IsPreviousCachedToken(const Token &Tok) const {
> + assert(CachedLexPos != 0 && "Expected to have some cached tokens");
> + const Token LastCachedTok = CachedTokens[CachedLexPos - 1];
> +
> + if (LastCachedTok.getKind() != Tok.getKind())
> + return false;
> +
> + int RelOffset = 0;
> + if ((!getSourceManager().isInSameSLocAddrSpace(
> + Tok.getLocation(), getLastCachedTokenLocation(), &RelOffset)) ||
> + RelOffset)
> + return false;
> +
> + return true;
> +}
> +
> +void Preprocessor::ReplacePreviousCachedToken(SmallVectorImpl<Token> &NewToks) {
> + assert(CachedLexPos != 0 && "Expected to have some cached tokens");
> + CachedTokens.insert(CachedTokens.begin() + CachedLexPos - 1, NewToks.begin(),
> + NewToks.end());
> + CachedTokens.erase(CachedTokens.begin() + CachedLexPos - 1 + NewToks.size());
> + CachedLexPos += NewToks.size() - 1;
> +}
> Index: include/clang/Lex/Preprocessor.h
> ===================================================================
> --- include/clang/Lex/Preprocessor.h
> +++ include/clang/Lex/Preprocessor.h
> @@ -1185,6 +1185,17 @@
> return CachedTokens[CachedLexPos-1].getLastLoc();
> }
>
> + /// \brief Whether \p Tok is the most recent token (`CachedLexPos - 1`) in
> + /// CachedTokens.
> + bool IsPreviousCachedToken(const Token &Tok) const;
> +
> + /// \brief Replace token in `CachedLexPos - 1` in CachedTokens by the tokens
> + /// in \p NewToks.
> + ///
> + /// Useful when a token needs to be split in smaller ones and CachedTokens
> + /// most recent token must to be updated to reflect that.
> + void ReplacePreviousCachedToken(SmallVectorImpl<Token> &NewToks);
> +
> /// \brief Replace the last token with an annotation token.
> ///
> /// Like AnnotateCachedTokens(), this routine replaces an
>
>
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the cfe-commits
mailing list