From: Dmitri Gribenko Date: Mon, 6 Aug 2012 16:29:26 +0000 (+0000) Subject: Comment diagnostics: \return in void function: specialize diagnostic text for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88815f3f81361692dd281000e3e46bf163b2f28b;p=clang Comment diagnostics: \return in void function: specialize diagnostic text for ObjC methods. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161324 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Comment.h b/include/clang/AST/Comment.h index b1f6519631..6006d8d299 100644 --- a/include/clang/AST/Comment.h +++ b/include/clang/AST/Comment.h @@ -979,6 +979,9 @@ struct DeclInfo { /// Never true if \c IsFunctionDecl is true. unsigned IsTemplatePartialSpecialization : 1; + /// Is \c ThisDecl an ObjCMethodDecl. + unsigned IsObjCMethod : 1; + /// Is \c ThisDecl a non-static member function of C++ class or /// instance method of ObjC class. /// Can be true only if \c IsFunctionDecl is true. diff --git a/include/clang/Basic/DiagnosticCommentKinds.td b/include/clang/Basic/DiagnosticCommentKinds.td index 7c13644926..1594c313d7 100644 --- a/include/clang/Basic/DiagnosticCommentKinds.td +++ b/include/clang/Basic/DiagnosticCommentKinds.td @@ -102,12 +102,13 @@ def note_doc_tparam_name_suggestion : Note< def warn_doc_returns_not_attached_to_a_function_decl : Warning< "'\\%0' command used in a comment that is not attached to " - "a function declaration">, + "a function or method declaration">, InGroup, DefaultIgnore; def warn_doc_returns_attached_to_a_void_function : Warning< "'\\%0' command used in a comment that is attached to a " - "%select{void function|constructor|destructor}1">, + "%select{function returning void|constructor|destructor|" + "method returning void}1">, InGroup, DefaultIgnore; } // end of documentation issue category diff --git a/lib/AST/Comment.cpp b/lib/AST/Comment.cpp index ac224ccecd..e35b2a3d5e 100644 --- a/lib/AST/Comment.cpp +++ b/lib/AST/Comment.cpp @@ -145,6 +145,7 @@ void DeclInfo::fill() { IsTemplateDecl = false; IsTemplateSpecialization = false; IsTemplatePartialSpecialization = false; + IsObjCMethod = false; IsInstanceMethod = false; IsClassMethod = false; ParamVars = ArrayRef(); @@ -193,6 +194,7 @@ void DeclInfo::fill() { ParamVars = ArrayRef(MD->param_begin(), MD->param_size()); ResultType = MD->getResultType(); + IsObjCMethod = true; IsInstanceMethod = MD->isInstanceMethod(); IsClassMethod = !IsInstanceMethod; break; diff --git a/lib/AST/CommentSema.cpp b/lib/AST/CommentSema.cpp index c8422508d3..770d5bba24 100644 --- a/lib/AST/CommentSema.cpp +++ b/lib/AST/CommentSema.cpp @@ -481,7 +481,10 @@ void Sema::checkReturnsCommand(const BlockCommandComment *Command) { unsigned DiagKind; switch (ThisDeclInfo->ThisDecl->getKind()) { default: - DiagKind = 0; + if (ThisDeclInfo->IsObjCMethod) + DiagKind = 3; + else + DiagKind = 0; break; case Decl::CXXConstructor: DiagKind = 1; diff --git a/test/Sema/warn-documentation.cpp b/test/Sema/warn-documentation.cpp index addbc6a09f..19d43ab488 100644 --- a/test/Sema/warn-documentation.cpp +++ b/test/Sema/warn-documentation.cpp @@ -286,37 +286,37 @@ int test_returns_right_decl_4(int aaa); template T test_returns_right_decl_5(T aaa); -// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa int test_returns_wrong_decl_1; -// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\return' command used in a comment that is not attached to a function or method declaration}} /// \return Aaa int test_returns_wrong_decl_2; -// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\result' command used in a comment that is not attached to a function or method declaration}} /// \result Aaa int test_returns_wrong_decl_3; -// expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}} +// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} /// \returns Aaa void test_returns_wrong_decl_4(int); -// expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}} +// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} /// \returns Aaa template void test_returns_wrong_decl_5(T aaa); -// expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}} +// expected-warning@+1 {{'\returns' command used in a comment that is attached to a function returning void}} /// \returns Aaa template<> void test_returns_wrong_decl_5(int aaa); -// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa struct test_returns_wrong_decl_6 { }; -// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa class test_returns_wrong_decl_7 { // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}} @@ -328,15 +328,15 @@ class test_returns_wrong_decl_7 { ~test_returns_wrong_decl_7(); }; -// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa enum test_returns_wrong_decl_8 { - // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} + // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa test_returns_wrong_decl_9 }; -// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}} +// expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function or method declaration}} /// \returns Aaa namespace test_returns_wrong_decl_10 { }; diff --git a/test/Sema/warn-documentation.m b/test/Sema/warn-documentation.m index 4b6aac3b49..7b6361c1f4 100644 --- a/test/Sema/warn-documentation.m +++ b/test/Sema/warn-documentation.m @@ -82,3 +82,12 @@ int a; int b; +@interface TestReturns1 +/// \returns Aaa +- (int)test1:(NSString *)aaa; + +// expected-warning@+1 {{'\returns' command used in a comment that is attached to a method returning void}} +/// \returns Aaa +- (void)test2:(NSString *)aaa; +@end +