[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