summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2012-07-24 16:10:47 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2012-07-24 16:10:47 +0000
commit1c85d5b17d0bd4b688e6fd4a59ad9c6dc4a817a6 (patch)
tree8802e3ba0c749c7d9db109beb37ebbfe2c1577dc
parent86f8bbced497389de5d35f0d6728ad9d846347b4 (diff)
downloadbcm5719-llvm-1c85d5b17d0bd4b688e6fd4a59ad9c6dc4a817a6.tar.gz
bcm5719-llvm-1c85d5b17d0bd4b688e6fd4a59ad9c6dc4a817a6.zip
Comment parsing: retokenized text tokens are now pushed back in correct (not
reverse) order llvm-svn: 160675
-rw-r--r--clang/include/clang/AST/CommentParser.h2
-rw-r--r--clang/lib/AST/CommentParser.cpp7
-rw-r--r--clang/unittests/AST/CommentParser.cpp25
3 files changed, 31 insertions, 3 deletions
diff --git a/clang/include/clang/AST/CommentParser.h b/clang/include/clang/AST/CommentParser.h
index 47cab25f250..1e4e4f8694b 100644
--- a/clang/include/clang/AST/CommentParser.h
+++ b/clang/include/clang/AST/CommentParser.h
@@ -83,7 +83,7 @@ class Parser {
MoreLATokens.push_back(Tok);
for (const Token *I = &Toks.back(),
- *B = &Toks.front() + 1;
+ *B = &Toks.front();
I != B; --I) {
MoreLATokens.push_back(*I);
}
diff --git a/clang/lib/AST/CommentParser.cpp b/clang/lib/AST/CommentParser.cpp
index 6b7e0ab49d4..92ea7042ff1 100644
--- a/clang/lib/AST/CommentParser.cpp
+++ b/clang/lib/AST/CommentParser.cpp
@@ -105,9 +105,12 @@ BlockCommandComment *Parser::parseBlockCommand() {
BC = parseBlockCommandArgs(BC, Retokenizer, NumArgs);
// Put back tokens we didn't use.
+ SmallVector<Token, 16> TextToks;
Token Text;
- while (Retokenizer.lexText(Text))
- putBack(Text);
+ while (Retokenizer.lexText(Text)) {
+ TextToks.push_back(Text);
+ }
+ putBack(TextToks);
}
BlockContentComment *Block = parseParagraphOrBlockCommand();
diff --git a/clang/unittests/AST/CommentParser.cpp b/clang/unittests/AST/CommentParser.cpp
index 87e10cebc06..ed7681d5c58 100644
--- a/clang/unittests/AST/CommentParser.cpp
+++ b/clang/unittests/AST/CommentParser.cpp
@@ -755,6 +755,31 @@ TEST_F(CommentParserTest, ParamCommand4) {
}
}
+TEST_F(CommentParserTest, ParamCommand5) {
+ const char *Source =
+ "// \\param aaa \\% Bbb \\$ ccc\n";
+
+ FullComment *FC = parseString(Source);
+ ASSERT_TRUE(HasChildCount(FC, 2));
+
+ ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
+ {
+ ParamCommandComment *PCC;
+ ParagraphComment *PC;
+ ASSERT_TRUE(HasParamCommandAt(FC, 1, PCC, "param",
+ ParamCommandComment::In,
+ /* IsDirectionExplicit = */ false,
+ "aaa", PC));
+ ASSERT_TRUE(HasChildCount(PCC, 1));
+
+ ASSERT_TRUE(HasChildCount(PC, 5));
+ ASSERT_TRUE(HasTextAt(PC, 0, " "));
+ ASSERT_TRUE(HasTextAt(PC, 1, "%"));
+ ASSERT_TRUE(HasTextAt(PC, 2, " Bbb "));
+ ASSERT_TRUE(HasTextAt(PC, 3, "$"));
+ ASSERT_TRUE(HasTextAt(PC, 4, " ccc"));
+ }
+}
TEST_F(CommentParserTest, InlineCommand1) {
const char *Source = "// \\c";
OpenPOWER on IntegriCloud