From: Dmitri Gribenko Date: Tue, 24 Jul 2012 16:10:47 +0000 (+0000) Subject: Comment parsing: retokenized text tokens are now pushed back in correct (not X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fd939162ff99a0084ed22a08dd37c149a0883a2b;p=clang Comment parsing: retokenized text tokens are now pushed back in correct (not reverse) order git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160675 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/CommentParser.h b/include/clang/AST/CommentParser.h index 47cab25f25..1e4e4f8694 100644 --- a/include/clang/AST/CommentParser.h +++ b/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/lib/AST/CommentParser.cpp b/lib/AST/CommentParser.cpp index 6b7e0ab49d..92ea7042ff 100644 --- a/lib/AST/CommentParser.cpp +++ b/lib/AST/CommentParser.cpp @@ -105,9 +105,12 @@ BlockCommandComment *Parser::parseBlockCommand() { BC = parseBlockCommandArgs(BC, Retokenizer, NumArgs); // Put back tokens we didn't use. + SmallVector 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/unittests/AST/CommentParser.cpp b/unittests/AST/CommentParser.cpp index 87e10cebc0..ed7681d5c5 100644 --- a/unittests/AST/CommentParser.cpp +++ b/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";