Skip to content
Snippets Groups Projects
Commit 5fcbbd60 authored by Bruno Cardoso Lopes's avatar Bruno Cardoso Lopes
Browse files

[Sema][Comments] Support @param with c++ 'using' keyword

Give appropriate warnings with -Wdocumentation for @param comments
that refer to function aliases defined with 'using'. Very similar
to typedef's behavior. This does not add support for
TypeAliasTemplateDecl yet.

Differential Revision: https://reviews.llvm.org/D23783

rdar://problem/27300695

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@279662 91177308-0d34-0410-b5e6-96231b3b80d8
parent add6a134
No related branches found
No related tags found
No related merge requests found
...@@ -226,12 +226,15 @@ void DeclInfo::fill() { ...@@ -226,12 +226,15 @@ void DeclInfo::fill() {
case Decl::Namespace: case Decl::Namespace:
Kind = NamespaceKind; Kind = NamespaceKind;
break; break;
case Decl::TypeAlias:
case Decl::Typedef: { case Decl::Typedef: {
Kind = TypedefKind; Kind = TypedefKind;
// If this is a typedef to something we consider a function, extract // If this is a typedef / using to something we consider a function, extract
// arguments and return type. // arguments and return type.
const TypedefDecl *TD = cast<TypedefDecl>(CommentDecl); const TypeSourceInfo *TSI =
const TypeSourceInfo *TSI = TD->getTypeSourceInfo(); K == Decl::Typedef
? cast<TypedefDecl>(CommentDecl)->getTypeSourceInfo()
: cast<TypeAliasDecl>(CommentDecl)->getTypeSourceInfo();
if (!TSI) if (!TSI)
break; break;
TypeLoc TL = TSI->getTypeLoc().getUnqualifiedLoc(); TypeLoc TL = TSI->getTypeLoc().getUnqualifiedLoc();
...@@ -302,9 +305,6 @@ void DeclInfo::fill() { ...@@ -302,9 +305,6 @@ void DeclInfo::fill() {
} }
break; break;
} }
case Decl::TypeAlias:
Kind = TypedefKind;
break;
case Decl::TypeAliasTemplate: { case Decl::TypeAliasTemplate: {
const TypeAliasTemplateDecl *TAT = cast<TypeAliasTemplateDecl>(CommentDecl); const TypeAliasTemplateDecl *TAT = cast<TypeAliasTemplateDecl>(CommentDecl);
Kind = TypedefKind; Kind = TypedefKind;
......
...@@ -368,6 +368,69 @@ typedef unsigned int test_not_function_like_typedef3; ...@@ -368,6 +368,69 @@ typedef unsigned int test_not_function_like_typedef3;
/// \param aaa Meow. /// \param aaa Meow.
typedef foo::not_a_function_wrapper<1> test_not_function_like_typedef4; typedef foo::not_a_function_wrapper<1> test_not_function_like_typedef4;
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using1 = int (int aaa, int ccc);
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using2 = int (*)(int aaa, int ccc);
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using3 = int (* const)(int aaa, int ccc);
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using4 = int (C::*)(int aaa, int ccc);
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using5 = foo::function_wrapper<int (int aaa, int ccc)>;
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using6 = foo::function_wrapper<int (int aaa, int ccc)> *;
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using7 = foo::function_wrapper<int (int aaa, int ccc)> &;
// expected-warning@+2 {{parameter 'bbb' not found in the function declaration}} expected-note@+2 {{did you mean 'ccc'?}}
/// \param aaa Meow.
/// \param bbb Bbb.
/// \returns aaa.
using test_function_like_using8 = foo::function_wrapper<int (int aaa, int ccc)> &&;
using test_not_function_like_using1 = int (*)(int aaa);
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
using test_not_function_like_using2 = test_not_function_like_using1;
// Check that the diagnostic uses the same command marker as the comment.
// expected-warning@+1 {{'@param' command used in a comment that is not attached to a function declaration}}
/// @param aaa Meow.
using test_not_function_like_using3 = unsigned int;
// expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
/// \param aaa Meow.
using test_not_function_like_using4 = foo::not_a_function_wrapper<1>;
/// \param aaa Aaa /// \param aaa Aaa
/// \param ... Vararg /// \param ... Vararg
int test_vararg_param1(int aaa, ...); int test_vararg_param1(int aaa, ...);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment