forked from OSchip/llvm-project
Fixed a bug in AnnotatedLine::startsWith when there are comments in the line.
Summary: When there are comments in the line, one token may be checked multiple times. Reviewers: mprobst, djasper Subscribers: ioeric, cfe-commits, klimek Differential Revision: http://reviews.llvm.org/D19106 llvm-svn: 266803
This commit is contained in:
parent
50d4e98905
commit
89be047201
|
@ -83,7 +83,7 @@ public:
|
|||
/// \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 @@ private:
|
|||
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...);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue