Comment diagnostics: warn if \returns is used in a non-function comment or if
the function returns void.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161261 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Comment.cpp b/lib/AST/Comment.cpp
index 645aea7..ac224cc 100644
--- a/lib/AST/Comment.cpp
+++ b/lib/AST/Comment.cpp
@@ -141,7 +141,7 @@
   assert(!IsFilled);
 
   // Set defaults.
-  Kind = FunctionKind;
+  Kind = OtherKind;
   IsTemplateDecl = false;
   IsTemplateSpecialization = false;
   IsTemplatePartialSpecialization = false;
@@ -170,6 +170,7 @@
     Kind = FunctionKind;
     ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
                                               FD->getNumParams());
+    ResultType = FD->getResultType();
     unsigned NumLists = FD->getNumTemplateParameterLists();
     if (NumLists != 0) {
       IsTemplateDecl = true;
@@ -178,7 +179,8 @@
           FD->getTemplateParameterList(NumLists - 1);
     }
 
-    if (K == Decl::CXXMethod) {
+    if (K == Decl::CXXMethod || K == Decl::CXXConstructor ||
+        K == Decl::CXXDestructor || K == Decl::CXXConversion) {
       const CXXMethodDecl *MD = cast<CXXMethodDecl>(ThisDecl);
       IsInstanceMethod = MD->isInstance();
       IsClassMethod = !IsInstanceMethod;
@@ -190,6 +192,7 @@
     Kind = FunctionKind;
     ParamVars = ArrayRef<const ParmVarDecl *>(MD->param_begin(),
                                               MD->param_size());
+    ResultType = MD->getResultType();
     IsInstanceMethod = MD->isInstanceMethod();
     IsClassMethod = !IsInstanceMethod;
     break;
@@ -201,6 +204,7 @@
     const FunctionDecl *FD = FTD->getTemplatedDecl();
     ParamVars = ArrayRef<const ParmVarDecl *>(FD->param_begin(),
                                               FD->getNumParams());
+    ResultType = FD->getResultType();
     TemplateParameters = FTD->getTemplateParameters();
     break;
   }
@@ -226,6 +230,7 @@
     IsTemplateSpecialization = true;
     break;
   case Decl::Record:
+  case Decl::CXXRecord:
     Kind = ClassKind;
     break;
   case Decl::Var: