From b0b8a96df25660cbdbf35d23c3ff5887c33f82f9 Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Tue, 11 Sep 2012 19:22:03 +0000 Subject: [PATCH] Comment parsing: handle non-builtin commands correctly. After semantic analysis registers a command, it becomes a "known" command for the lexer, since it has an ID. Having this freedom of choice to register a command is a good thing since BriefParser does not need this. But the parser should still invoke the correct semantic analysis method (actOnUnknownCommand) in this case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163646 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/CommentLexer.h | 4 ++-- include/clang/AST/CommentSema.h | 6 +++++- lib/AST/CommentCommandTraits.cpp | 1 + lib/AST/CommentParser.cpp | 7 +++++++ lib/AST/CommentSema.cpp | 10 ++++++++-- test/Sema/warn-documentation.cpp | 5 +++++ 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/include/clang/AST/CommentLexer.h b/include/clang/AST/CommentLexer.h index 99b95d3404..f2636973ff 100644 --- a/include/clang/AST/CommentLexer.h +++ b/include/clang/AST/CommentLexer.h @@ -34,8 +34,8 @@ enum TokenKind { eof, newline, text, - unknown_command, - command, + unknown_command, // Command that does not have an ID. + command, // Command with an ID. verbatim_block_begin, verbatim_block_line, verbatim_block_end, diff --git a/include/clang/AST/CommentSema.h b/include/clang/AST/CommentSema.h index 5ebf5f0afa..c913d28dae 100644 --- a/include/clang/AST/CommentSema.h +++ b/include/clang/AST/CommentSema.h @@ -139,7 +139,11 @@ public: InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin, SourceLocation LocEnd, - StringRef Name); + StringRef CommandName); + + InlineContentComment *actOnUnknownCommand(SourceLocation LocBegin, + SourceLocation LocEnd, + unsigned CommandID); TextComment *actOnText(SourceLocation LocBegin, SourceLocation LocEnd, diff --git a/lib/AST/CommentCommandTraits.cpp b/lib/AST/CommentCommandTraits.cpp index ba0aa9ae12..e7e40fd109 100644 --- a/lib/AST/CommentCommandTraits.cpp +++ b/lib/AST/CommentCommandTraits.cpp @@ -40,6 +40,7 @@ const CommandInfo *CommandTraits::registerUnknownCommand(StringRef CommandName) CommandInfo *Info = new (Allocator) CommandInfo(); Info->Name = Name; Info->ID = NextID++; + Info->IsUnknownCommand = true; RegisteredCommands.push_back(Info); diff --git a/lib/AST/CommentParser.cpp b/lib/AST/CommentParser.cpp index f6acd9645f..d053dc0f18 100644 --- a/lib/AST/CommentParser.cpp +++ b/lib/AST/CommentParser.cpp @@ -554,6 +554,13 @@ BlockContentComment *Parser::parseParagraphOrBlockCommand() { return parseBlockCommand(); break; // Block command ahead, finish this parapgaph. } + if (Info->IsUnknownCommand) { + Content.push_back(S.actOnUnknownCommand(Tok.getLocation(), + Tok.getEndLocation(), + Info->getID())); + consumeToken(); + continue; + } assert(Info->IsInlineCommand); Content.push_back(parseInlineCommand()); continue; diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index e57dac7104..477717f735 100644 --- a/lib/AST/CommentSema.cpp +++ b/lib/AST/CommentSema.cpp @@ -272,9 +272,15 @@ InlineCommandComment *Sema::actOnInlineCommand(SourceLocation CommandLocBegin, InlineContentComment *Sema::actOnUnknownCommand(SourceLocation LocBegin, SourceLocation LocEnd, - StringRef Name) { + StringRef CommandName) { + unsigned CommandID = Traits.registerUnknownCommand(CommandName)->getID(); + return actOnUnknownCommand(LocBegin, LocEnd, CommandID); +} + +InlineContentComment *Sema::actOnUnknownCommand(SourceLocation LocBegin, + SourceLocation LocEnd, + unsigned CommandID) { ArrayRef Args; - unsigned CommandID = Traits.registerUnknownCommand(Name)->getID(); return new (Allocator) InlineCommandComment( LocBegin, LocEnd, CommandID, InlineCommandComment::RenderNormal, diff --git a/test/Sema/warn-documentation.cpp b/test/Sema/warn-documentation.cpp index 80880d453a..28544e0a81 100644 --- a/test/Sema/warn-documentation.cpp +++ b/test/Sema/warn-documentation.cpp @@ -761,3 +761,8 @@ inline void test_nocrash6() */ typedef const struct test_nocrash7 * test_nocrash8; +// We used to crash on this. + +/// aaa \unknown aaa \unknown aaa +int test_nocrash9; + -- 2.40.0