This revision was automatically updated to reflect the committed changes. Closed by commit rL266803: Fixed a bug in AnnotatedLine::startsWith when there are comments in the line. (authored by ioeric).
Changed prior to commit: http://reviews.llvm.org/D19106?vs=54240&id=54242#toc Repository: rL LLVM http://reviews.llvm.org/D19106 Files: cfe/trunk/lib/Format/TokenAnnotator.h Index: cfe/trunk/lib/Format/TokenAnnotator.h =================================================================== --- cfe/trunk/lib/Format/TokenAnnotator.h +++ cfe/trunk/lib/Format/TokenAnnotator.h @@ -83,7 +83,7 @@ /// \c true if this line starts with the given tokens in order, ignoring /// comments. template <typename... Ts> bool startsWith(Ts... Tokens) const { - return startsWith(First, Tokens...); + return startsWithInternal(First, Tokens...); } /// \c true if this line looks like a function definition instead of a @@ -124,15 +124,24 @@ void operator=(const AnnotatedLine &) = delete; template <typename A, typename... Ts> - bool startsWith(FormatToken *Tok, A K1) const { + bool startsWithInternal(const FormatToken *Tok, A K1) const { + // Even though we skip comments in the outer `startWithInternal` function, + // this loop is still necessary if it is invoked by the public interface + // `startsWith`. while (Tok && Tok->is(tok::comment)) Tok = Tok->Next; return Tok && Tok->is(K1); } template <typename A, typename... Ts> - bool startsWith(FormatToken *Tok, A K1, Ts... Tokens) const { - return startsWith(Tok, K1) && startsWith(Tok->Next, Tokens...); + bool startsWithInternal(const FormatToken *Tok, A K1, Ts... Tokens) const { + // Skip comments before calling `startsWithInternal(Tok, K1)` so that the + // second call to `startsWithInternal` takes the correct `Tok->Next`, which + // should be the next token of the token checked in the first call. + while (Tok && Tok->is(tok::comment)) + Tok = Tok->Next; + return Tok && startsWithInternal(Tok, K1) && + startsWithInternal(Tok->Next, Tokens...); } };
Index: cfe/trunk/lib/Format/TokenAnnotator.h =================================================================== --- cfe/trunk/lib/Format/TokenAnnotator.h +++ cfe/trunk/lib/Format/TokenAnnotator.h @@ -83,7 +83,7 @@ /// \c true if this line starts with the given tokens in order, ignoring /// comments. template <typename... Ts> bool startsWith(Ts... Tokens) const { - return startsWith(First, Tokens...); + return startsWithInternal(First, Tokens...); } /// \c true if this line looks like a function definition instead of a @@ -124,15 +124,24 @@ void operator=(const AnnotatedLine &) = delete; template <typename A, typename... Ts> - bool startsWith(FormatToken *Tok, A K1) const { + bool startsWithInternal(const FormatToken *Tok, A K1) const { + // Even though we skip comments in the outer `startWithInternal` function, + // this loop is still necessary if it is invoked by the public interface + // `startsWith`. while (Tok && Tok->is(tok::comment)) Tok = Tok->Next; return Tok && Tok->is(K1); } template <typename A, typename... Ts> - bool startsWith(FormatToken *Tok, A K1, Ts... Tokens) const { - return startsWith(Tok, K1) && startsWith(Tok->Next, Tokens...); + bool startsWithInternal(const FormatToken *Tok, A K1, Ts... Tokens) const { + // Skip comments before calling `startsWithInternal(Tok, K1)` so that the + // second call to `startsWithInternal` takes the correct `Tok->Next`, which + // should be the next token of the token checked in the first call. + while (Tok && Tok->is(tok::comment)) + Tok = Tok->Next; + return Tok && startsWithInternal(Tok, K1) && + startsWithInternal(Tok->Next, Tokens...); } };
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits