diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2013-12-17 22:06:11 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2013-12-17 22:06:11 +0000 |
commit | fa68a57cf71d20b2e0e02db32fd2e6a0fc2da1f8 (patch) | |
tree | 09c9c0cdc61cb233812a382f55e3a55e854ce224 /clang/lib/AST/Comment.cpp | |
parent | 2553e49a5d7893c9a0d3846153a2536893fa5744 (diff) | |
download | bcm5719-llvm-fa68a57cf71d20b2e0e02db32fd2e6a0fc2da1f8.tar.gz bcm5719-llvm-fa68a57cf71d20b2e0e02db32fd2e6a0fc2da1f8.zip |
Documentation comment parsing: allow \param and \returns on std::function,
boost::function and similar function-like objects
llvm-svn: 197528
Diffstat (limited to 'clang/lib/AST/Comment.cpp')
-rw-r--r-- | clang/lib/AST/Comment.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/AST/Comment.cpp b/clang/lib/AST/Comment.cpp index e60eed9630c..292129b9602 100644 --- a/clang/lib/AST/Comment.cpp +++ b/clang/lib/AST/Comment.cpp @@ -266,6 +266,10 @@ void DeclInfo::fill() { TL = MemberPointerTL.getPointeeLoc().getUnqualifiedLoc(); continue; } + if (ElaboratedTypeLoc ETL = TL.getAs<ElaboratedTypeLoc>()) { + TL = ETL.getNamedTypeLoc(); + continue; + } // Is this a typedef for a function type? if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) { Kind = FunctionKind; @@ -275,6 +279,28 @@ void DeclInfo::fill() { ResultType = FTL.getResultLoc().getType(); break; } + if (TemplateSpecializationTypeLoc STL = + TL.getAs<TemplateSpecializationTypeLoc>()) { + // If we have a typedef to a template specialization with exactly one + // template argument of a function type, this looks like std::function, + // boost::function, or other function wrapper. Treat these typedefs as + // functions. + if (STL.getNumArgs() != 1) + break; + TemplateArgumentLoc MaybeFunction = STL.getArgLoc(0); + if (MaybeFunction.getArgument().getKind() != TemplateArgument::Type) + break; + TypeSourceInfo *MaybeFunctionTSI = MaybeFunction.getTypeSourceInfo(); + TypeLoc TL = MaybeFunctionTSI->getTypeLoc().getUnqualifiedLoc(); + if (FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>()) { + Kind = FunctionKind; + ArrayRef<ParmVarDecl *> Params = FTL.getParams(); + ParamVars = ArrayRef<const ParmVarDecl *>(Params.data(), + Params.size()); + ResultType = FTL.getResultLoc().getType(); + } + break; + } break; } break; |