forked from OSchip/llvm-project
Comment parsing: don't crash while parsing \deprecated in a standalone comment
(comment without a decl). I think this can not happen during normal compilation with -Wdocumentation, only while using Clang APIs to parse comments outside of a source file. Based on a patch by Olivier Goffart. llvm-svn: 200230
This commit is contained in:
parent
73afb43213
commit
6bf8f803f2
|
@ -68,8 +68,12 @@ void Sema::actOnBlockCommandFinish(BlockCommandComment *Command,
|
|||
Command->setParagraph(Paragraph);
|
||||
checkBlockCommandEmptyParagraph(Command);
|
||||
checkBlockCommandDuplicate(Command);
|
||||
checkReturnsCommand(Command);
|
||||
checkDeprecatedCommand(Command);
|
||||
if (ThisDeclInfo) {
|
||||
// These checks only make sense if the comment is attached to a
|
||||
// declaration.
|
||||
checkReturnsCommand(Command);
|
||||
checkDeprecatedCommand(Command);
|
||||
}
|
||||
}
|
||||
|
||||
ParamCommandComment *Sema::actOnParamCommandStart(
|
||||
|
@ -558,6 +562,9 @@ void Sema::checkBlockCommandEmptyParagraph(BlockCommandComment *Command) {
|
|||
void Sema::checkReturnsCommand(const BlockCommandComment *Command) {
|
||||
if (!Traits.getCommandInfo(Command->getCommandID())->IsReturnsCommand)
|
||||
return;
|
||||
|
||||
assert(ThisDeclInfo && "should not call this check on a bare comment");
|
||||
|
||||
if (isFunctionDecl()) {
|
||||
if (ThisDeclInfo->ReturnType->isVoidType()) {
|
||||
unsigned DiagKind;
|
||||
|
@ -636,6 +643,8 @@ void Sema::checkDeprecatedCommand(const BlockCommandComment *Command) {
|
|||
if (!Traits.getCommandInfo(Command->getCommandID())->IsDeprecatedCommand)
|
||||
return;
|
||||
|
||||
assert(ThisDeclInfo && "should not call this check on a bare comment");
|
||||
|
||||
const Decl *D = ThisDeclInfo->CommentDecl;
|
||||
if (!D)
|
||||
return;
|
||||
|
|
|
@ -1420,6 +1420,26 @@ TEST_F(CommentParserTest, VerbatimLine2) {
|
|||
}
|
||||
}
|
||||
|
||||
TEST_F(CommentParserTest, Deprecated) {
|
||||
const char *Sources[] = {
|
||||
"/** @deprecated*/",
|
||||
"/// @deprecated\n"
|
||||
};
|
||||
|
||||
for (size_t i = 0, e = array_lengthof(Sources); i != e; i++) {
|
||||
FullComment *FC = parseString(Sources[i]);
|
||||
ASSERT_TRUE(HasChildCount(FC, 2));
|
||||
|
||||
ASSERT_TRUE(HasParagraphCommentAt(FC, 0, " "));
|
||||
{
|
||||
BlockCommandComment *BCC;
|
||||
ParagraphComment *PC;
|
||||
ASSERT_TRUE(HasBlockCommandAt(FC, Traits, 1, BCC, "deprecated", PC));
|
||||
ASSERT_TRUE(HasChildCount(PC, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // unnamed namespace
|
||||
|
||||
} // end namespace comments
|
||||
|
|
Loading…
Reference in New Issue