diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-10-06 20:51:04 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-10-06 20:51:04 +0000 |
commit | c1458454c9b4c28723f31f50bbd97234cdee31de (patch) | |
tree | 30efcd9e7dc6b7a8d9e03c8f801dfbd291a7dd36 | |
parent | f1381a926e22e996f38e74fd74bc9a25dfbac8f9 (diff) |
-Wdocumentation should allow '...' params in variadic function type aliases
rdar://34811344
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315103 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/CommentSema.cpp | 10 | ||||
-rw-r--r-- | test/Sema/warn-documentation.cpp | 22 | ||||
-rw-r--r-- | test/Sema/warn-documentation.m | 11 |
3 files changed, 42 insertions, 1 deletions
diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index 403454d3ab..6c2019e1a7 100644 --- a/lib/AST/CommentSema.cpp +++ b/lib/AST/CommentSema.cpp @@ -813,7 +813,7 @@ bool Sema::isAnyFunctionDecl() { } bool Sema::isFunctionOrMethodVariadic() { - if (!isAnyFunctionDecl() && !isObjCMethodDecl() && !isFunctionTemplateDecl()) + if (!isFunctionDecl() || !ThisDeclInfo->CurrentDecl) return false; if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ThisDeclInfo->CurrentDecl)) @@ -824,6 +824,14 @@ bool Sema::isFunctionOrMethodVariadic() { if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ThisDeclInfo->CurrentDecl)) return MD->isVariadic(); + if (const TypedefNameDecl *TD = + dyn_cast<TypedefNameDecl>(ThisDeclInfo->CurrentDecl)) { + QualType Type = TD->getUnderlyingType(); + if (Type->isFunctionPointerType() || Type->isBlockPointerType()) + Type = Type->getPointeeType(); + if (const auto *FT = Type->getAs<FunctionProtoType>()) + return FT->isVariadic(); + } return false; } diff --git a/test/Sema/warn-documentation.cpp b/test/Sema/warn-documentation.cpp index ccf374ccd0..7ffaffc078 100644 --- a/test/Sema/warn-documentation.cpp +++ b/test/Sema/warn-documentation.cpp @@ -1282,3 +1282,25 @@ struct HasMoreFields { }; } + +/*! + * Function pointer typedef with variadic params. + * + * @param a + * works + * + * @param ... + * now should work too. + */ +typedef void (*VariadicFnType)(int a, ...); + +/*! + * Function pointer type alias with variadic params. + * + * @param a + * works + * + * @param ... + * now should work too. + */ +using VariadicFnType2 = void (*)(int a, ...); diff --git a/test/Sema/warn-documentation.m b/test/Sema/warn-documentation.m index 3c1a369c4b..18ab5bd9e0 100644 --- a/test/Sema/warn-documentation.m +++ b/test/Sema/warn-documentation.m @@ -299,3 +299,14 @@ void (^_Nullable blockPointerVariableThatLeadsNowhere)(); @property void (^blockReturnsNothing)(); @end + +/*! + * Block typedef with variadic params. + * + * @param a + * works + * + * @param ... + * now should work too. + */ +typedef void (^VariadicBlockType)(int a, ...); |