r184249 - doc. parsing: Allow parameter name "..." for variadic functions/methods.

NAKAMURA Takumi geek4civic at gmail.com
Wed Jun 19 00:03:46 PDT 2013


Fariborz, I had to revert it in r184283.

It crashes in a simple case, with "..." without any params.
/// The description without "param"s.
int printf(const char *format, ...);

In a practical case, it crashed in llvm::StructType::get(Type *elt1,
...), llvm/IR/DerivedTypes.h.

2013/6/19 Fariborz Jahanian <fjahanian at apple.com>:
> Author: fjahanian
> Date: Tue Jun 18 17:40:39 2013
> New Revision: 184249
>
> URL: http://llvm.org/viewvc/llvm-project?rev=184249&view=rev
> Log:
> doc. parsing: Allow parameter name "..." for variadic functions/methods.
> // rdar://14124644
>
> Modified:
>     cfe/trunk/include/clang/AST/CommentSema.h
>     cfe/trunk/lib/AST/CommentSema.cpp
>     cfe/trunk/test/Sema/warn-documentation.m
>
> Modified: cfe/trunk/include/clang/AST/CommentSema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CommentSema.h?rev=184249&r1=184248&r2=184249&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/CommentSema.h (original)
> +++ cfe/trunk/include/clang/AST/CommentSema.h Tue Jun 18 17:40:39 2013
> @@ -220,6 +220,7 @@ public:
>    bool isUnionDecl();
>    bool isObjCInterfaceDecl();
>    bool isObjCProtocolDecl();
> +  bool isFunctionOrMethodVariadic();
>
>    ArrayRef<const ParmVarDecl *> getParamVars();
>
>
> Modified: cfe/trunk/lib/AST/CommentSema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CommentSema.cpp?rev=184249&r1=184248&r2=184249&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/CommentSema.cpp (original)
> +++ cfe/trunk/lib/AST/CommentSema.cpp Tue Jun 18 17:40:39 2013
> @@ -720,7 +720,7 @@ void Sema::resolveParamCommandIndexes(co
>    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(S
>      if (II && II->getName() == Name)
>        return i;
>    }
> +  if (Name == "..." && isFunctionOrMethodVariadic())
> +    return ParamVars.size();
>    return ParamCommandComment::InvalidParamIndex;
>  }
>
>
> Modified: cfe/trunk/test/Sema/warn-documentation.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-documentation.m?rev=184249&r1=184248&r2=184249&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-documentation.m (original)
> +++ cfe/trunk/test/Sema/warn-documentation.m Tue Jun 18 17:40:39 2013
> @@ -215,3 +215,22 @@ int FooBar();
>  /// \brief comment
>  -(void)meth {}
>  @end
> +
> +// rdar://14124644
> + at interface rdar14124644
> +/// @param[in] arg somthing
> +/// @param[in] ... This is vararg
> +- (void) VarArgMeth : (id)arg, ...;
> + at end
> +
> + at implementation rdar14124644
> +/// @param[in] arg somthing
> +/// @param[in] ... This is vararg
> +- (void) VarArgMeth : (id)arg, ... {}
> + at 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, ...);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list