]> granicus.if.org Git - clang/commitdiff
doc. parsing: Allow parameter name "..." for variadic functions/methods.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 18 Jun 2013 22:40:39 +0000 (22:40 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 18 Jun 2013 22:40:39 +0000 (22:40 +0000)
// rdar://14124644

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184249 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/CommentSema.h
lib/AST/CommentSema.cpp
test/Sema/warn-documentation.m

index 15e454dcc389ba2ad678cf6786404a14bf2ba7bf..490b88c1bb1d62fd65a58bc4669c1317ef4bdfef 100644 (file)
@@ -220,6 +220,7 @@ public:
   bool isUnionDecl();
   bool isObjCInterfaceDecl();
   bool isObjCProtocolDecl();
+  bool isFunctionOrMethodVariadic();
 
   ArrayRef<const ParmVarDecl *> getParamVars();
 
index c242eb0f6067b70bb584e0acc184f22b62a7973f..e6a5b85ed66630ce7b2e60d1b5daddcd4bfd3b2a 100644 (file)
@@ -720,7 +720,7 @@ void Sema::resolveParamCommandIndexes(const FullComment *FC) {
   SmallVector<ParamCommandComment *, 8> ParamVarDocs;
 
   ArrayRef<const ParmVarDecl *> ParamVars = getParamVars();
-  ParamVarDocs.resize(ParamVars.size(), NULL);
+  ParamVarDocs.resize(ParamVars.size() + isFunctionOrMethodVariadic(), NULL);
 
   // First pass over all \\param commands: resolve all parameter names.
   for (Comment::child_iterator I = FC->child_begin(), E = FC->child_end();
@@ -808,6 +808,18 @@ bool Sema::isObjCMethodDecl() {
   return isFunctionDecl() && ThisDeclInfo->CurrentDecl &&
          isa<ObjCMethodDecl>(ThisDeclInfo->CurrentDecl);
 }
+
+bool Sema::isFunctionOrMethodVariadic() {
+  if (!isAnyFunctionDecl() && !isObjCMethodDecl())
+    return false;
+  if (const FunctionDecl *FD = 
+        dyn_cast<FunctionDecl>(ThisDeclInfo->CurrentDecl))
+    return FD->isVariadic();
+  if (const ObjCMethodDecl *MD = 
+        dyn_cast<ObjCMethodDecl>(ThisDeclInfo->CurrentDecl))
+    return MD->isVariadic();
+  return false;
+}
   
 /// isFunctionPointerVarDecl - returns 'true' if declaration is a pointer to
 /// function decl.
@@ -906,6 +918,8 @@ unsigned Sema::resolveParmVarReference(StringRef Name,
     if (II && II->getName() == Name)
       return i;
   }
+  if (Name == "..." && isFunctionOrMethodVariadic())
+    return ParamVars.size();
   return ParamCommandComment::InvalidParamIndex;
 }
 
index 17dd92e6eba48f77ee6d76eb1e341becdbbf5114..e348dba3e0c37b5adc9fa0eff39ca9baa6dbcc41 100644 (file)
@@ -215,3 +215,22 @@ int FooBar();
 /// \brief comment
 -(void)meth {}
 @end
+
+// rdar://14124644
+@interface rdar14124644
+/// @param[in] arg somthing
+/// @param[in] ... This is vararg
+- (void) VarArgMeth : (id)arg, ...;
+@end
+
+@implementation rdar14124644
+/// @param[in] arg somthing
+/// @param[in] ... This is vararg
+- (void) VarArgMeth : (id)arg, ... {}
+@end
+
+/// @param[in] format somthing
+/// @param[in] ...
+///     Variable arguments that are needed for the printf style
+///     format string \a format.
+int printf(const char* format, ...);