diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-06-27 23:28:29 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-06-27 23:28:29 +0000 |
commit | 632d58afaba61b09df80f376215342f6c81f1026 (patch) | |
tree | 85886af3d761b1e15346c6284b52ac60caa49293 | |
parent | ef40238a0e419a75fd2b911321a8780532ac0adf (diff) | |
download | bcm5719-llvm-632d58afaba61b09df80f376215342f6c81f1026.tar.gz bcm5719-llvm-632d58afaba61b09df80f376215342f6c81f1026.zip |
Fix an infinite loop in comment lexer: we were not advancing in the input character stream when we saw a '<' that is not a start of an HTML tag.
llvm-svn: 159303
-rw-r--r-- | clang/lib/AST/CommentLexer.cpp | 5 | ||||
-rw-r--r-- | clang/unittests/AST/CommentLexer.cpp | 42 |
2 files changed, 37 insertions, 10 deletions
diff --git a/clang/lib/AST/CommentLexer.cpp b/clang/lib/AST/CommentLexer.cpp index 0b76050ff0b..c3a801d924c 100644 --- a/clang/lib/AST/CommentLexer.cpp +++ b/clang/lib/AST/CommentLexer.cpp @@ -357,6 +357,11 @@ void Lexer::lexCommentText(Token &T) { setupAndLexHTMLOpenTag(T); else if (C == '/') lexHTMLCloseTag(T); + else { + StringRef Text(BufferPtr, TokenPtr - BufferPtr); + formTokenWithChars(T, TokenPtr, tok::text); + T.setText(Text); + } return; } diff --git a/clang/unittests/AST/CommentLexer.cpp b/clang/unittests/AST/CommentLexer.cpp index a1e2427880c..5b4712df259 100644 --- a/clang/unittests/AST/CommentLexer.cpp +++ b/clang/unittests/AST/CommentLexer.cpp @@ -683,6 +683,28 @@ TEST_F(CommentLexerTest, HTML1) { } TEST_F(CommentLexerTest, HTML2) { + const char *Source = + "// < tag"; + + std::vector<Token> Toks; + + lexString(Source, Toks); + + ASSERT_EQ(4U, Toks.size()); + + ASSERT_EQ(tok::text, Toks[0].getKind()); + ASSERT_EQ(StringRef(" "), Toks[0].getText()); + + ASSERT_EQ(tok::text, Toks[1].getKind()); + ASSERT_EQ(StringRef("<"), Toks[1].getText()); + + ASSERT_EQ(tok::text, Toks[2].getKind()); + ASSERT_EQ(StringRef(" tag"), Toks[2].getText()); + + ASSERT_EQ(tok::newline, Toks[3].getKind()); +} + +TEST_F(CommentLexerTest, HTML3) { const char *Sources[] = { "// <tag", "// <tag " @@ -705,7 +727,7 @@ TEST_F(CommentLexerTest, HTML2) { } } -TEST_F(CommentLexerTest, HTML3) { +TEST_F(CommentLexerTest, HTML4) { const char *Source = "// <tag="; std::vector<Token> Toks; @@ -726,7 +748,7 @@ TEST_F(CommentLexerTest, HTML3) { ASSERT_EQ(tok::newline, Toks[3].getKind()); } -TEST_F(CommentLexerTest, HTML4) { +TEST_F(CommentLexerTest, HTML5) { const char *Sources[] = { "// <tag attr", "// <tag attr " @@ -752,7 +774,7 @@ TEST_F(CommentLexerTest, HTML4) { } } -TEST_F(CommentLexerTest, HTML5) { +TEST_F(CommentLexerTest, HTML6) { const char *Sources[] = { "// <tag attr=", "// <tag attr =" @@ -780,7 +802,7 @@ TEST_F(CommentLexerTest, HTML5) { } } -TEST_F(CommentLexerTest, HTML6) { +TEST_F(CommentLexerTest, HTML7) { const char *Sources[] = { "// <tag attr=\"", "// <tag attr = \"", @@ -813,7 +835,7 @@ TEST_F(CommentLexerTest, HTML6) { } } -TEST_F(CommentLexerTest, HTML7) { +TEST_F(CommentLexerTest, HTML8) { const char *Source = "// <tag attr=@"; std::vector<Token> Toks; @@ -839,7 +861,7 @@ TEST_F(CommentLexerTest, HTML7) { ASSERT_EQ(tok::newline, Toks[5].getKind()); } -TEST_F(CommentLexerTest, HTML8) { +TEST_F(CommentLexerTest, HTML9) { const char *Sources[] = { "// <tag attr=\"val\\\"\\'val", "// <tag attr=\"val\\\"\\'val\"", @@ -872,7 +894,7 @@ TEST_F(CommentLexerTest, HTML8) { } } -TEST_F(CommentLexerTest, HTML9) { +TEST_F(CommentLexerTest, HTML10) { const char *Sources[] = { "// <tag attr=\"val\\\"\\'val\">", "// <tag attr=\'val\\\"\\'val\'>" @@ -905,7 +927,7 @@ TEST_F(CommentLexerTest, HTML9) { } } -TEST_F(CommentLexerTest, HTML10) { +TEST_F(CommentLexerTest, HTML11) { const char *Source = "// </"; std::vector<Token> Toks; @@ -924,7 +946,7 @@ TEST_F(CommentLexerTest, HTML10) { } -TEST_F(CommentLexerTest, HTML11) { +TEST_F(CommentLexerTest, HTML12) { const char *Source = "// </@"; std::vector<Token> Toks; @@ -945,7 +967,7 @@ TEST_F(CommentLexerTest, HTML11) { ASSERT_EQ(tok::newline, Toks[3].getKind()); } -TEST_F(CommentLexerTest, HTML12) { +TEST_F(CommentLexerTest, HTML13) { const char *Sources[] = { "// </tag", "// </tag>", |