From d94b42f4228ee8647fa20111ffa996535ee5de67 Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Mon, 2 Sep 2019 18:24:33 +0000 Subject: [PATCH] [Wdocumentation] fixes an assertion failure with typedefed function and block pointer Summary: The assertion happens when compiling with -Wdocumentation with variable declaration to a typedefed function pointer. I not too familiar with the ObjC syntax but first two tests assert without this patch. Fixes https://bugs.llvm.org/show_bug.cgi?id=42844 Reviewers: gribozavr Reviewed By: gribozavr Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D66706 llvm-svn: 370677 --- clang/lib/AST/CommentSema.cpp | 8 ++++++++ clang/test/Sema/warn-documentation.cpp | 31 +++++++++++++++++++++++++++++++ clang/test/Sema/warn-documentation.m | 8 ++++++++ 3 files changed, 47 insertions(+) diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp index 067b3ae..69d61dc 100644 --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -588,6 +588,8 @@ void Sema::checkReturnsCommand(const BlockCommandComment *Command) { if (isObjCPropertyDecl()) return; if (isFunctionDecl() || isFunctionOrBlockPointerVarLikeDecl()) { + assert(!ThisDeclInfo->ReturnType.isNull() && + "should have a valid return type"); if (ThisDeclInfo->ReturnType->isVoidType()) { unsigned DiagKind; switch (ThisDeclInfo->CommentDecl->getKind()) { @@ -873,6 +875,12 @@ bool Sema::isFunctionOrBlockPointerVarLikeDecl() { // can be ignored. if (QT->getAs()) return false; + if (const auto *P = QT->getAs()) + if (P->getPointeeType()->getAs()) + return false; + if (const auto *P = QT->getAs()) + if (P->getPointeeType()->getAs()) + return false; return QT->isFunctionPointerType() || QT->isBlockPointerType(); } diff --git a/clang/test/Sema/warn-documentation.cpp b/clang/test/Sema/warn-documentation.cpp index 306c413..66f02ef 100644 --- a/clang/test/Sema/warn-documentation.cpp +++ b/clang/test/Sema/warn-documentation.cpp @@ -1360,3 +1360,34 @@ using VariadicFnType2 = void (*)(int a, ...); */ class EmptyNoteNoCrash { }; + +namespace PR42844 { // Assertion failures when using typedefed function pointers +typedef void (*AA)(); +typedef AA A(); +A *a; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +typedef void B(); +B *b; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +void CC(); +typedef void C(); +C &c = CC; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +using DD = void(*)(); +using D = DD(); +D *d; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +using E = void(); +E *e; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +void FF(); +using F = void(); +F &f = FF; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} + +} // namespace PR42844 diff --git a/clang/test/Sema/warn-documentation.m b/clang/test/Sema/warn-documentation.m index 0b75bcf..c713d5b 100644 --- a/clang/test/Sema/warn-documentation.m +++ b/clang/test/Sema/warn-documentation.m @@ -310,3 +310,11 @@ void (^_Nullable blockPointerVariableThatLeadsNowhere)(); * now should work too. */ typedef void (^VariadicBlockType)(int a, ...); + +// PR42844 - Assertion failures when using typedefed block pointers +typedef void(^VoidBlockType)(); +typedef VoidBlockType VoidBlockTypeCall(); +VoidBlockTypeCall *d; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} +VoidBlockTypeCall ^e; ///< \return none +// expected-warning@-1 {{'\return' command used in a comment that is not attached to a function or method declaration}} -- 2.7.4