summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Comment.cpp
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2013-12-17 22:06:11 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2013-12-17 22:06:11 +0000
commitfa68a57cf71d20b2e0e02db32fd2e6a0fc2da1f8 (patch)
tree09c9c0cdc61cb233812a382f55e3a55e854ce224 /clang/lib/AST/Comment.cpp
parent2553e49a5d7893c9a0d3846153a2536893fa5744 (diff)
downloadbcm5719-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.cpp26
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;
OpenPOWER on IntegriCloud