aaronpuchert created this revision.
aaronpuchert added a reviewer: gribozavr2.
aaronpuchert requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Instead of pretending that function pointer type aliases or variables
are functions, and thereby losing the information that they are type
aliases or variables, respectively, we use the existence of a return
type in the DeclInfo to signify a "function-like" object.
That seems pretty natural, since it's also the return type (or parameter
list) from the DeclInfo that we compare the documentation with.
Addresses a concern voiced in D111264#3115104
<https://reviews.llvm.org/D111264#3115104>.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D113691
Files:
clang/include/clang/AST/Comment.h
clang/include/clang/AST/CommentSema.h
clang/lib/AST/Comment.cpp
clang/lib/AST/CommentSema.cpp
Index: clang/lib/AST/CommentSema.cpp
===================================================================
--- clang/lib/AST/CommentSema.cpp
+++ clang/lib/AST/CommentSema.cpp
@@ -86,7 +86,7 @@
new (Allocator) ParamCommandComment(LocBegin, LocEnd, CommandID,
CommandMarker);
- if (!isFunctionDecl())
+ if (!involvesFunctionType())
Diag(Command->getLocation(),
diag::warn_doc_param_not_attached_to_a_function_decl)
<< CommandMarker
@@ -588,7 +588,7 @@
// to document the value that the property getter returns.
if (isObjCPropertyDecl())
return;
- if (isFunctionDecl()) {
+ if (involvesFunctionType()) {
assert(!ThisDeclInfo->ReturnType.isNull() &&
"should have a valid return type");
if (ThisDeclInfo->ReturnType->isVoidType()) {
@@ -728,7 +728,7 @@
}
void Sema::resolveParamCommandIndexes(const FullComment *FC) {
- if (!isFunctionDecl()) {
+ if (!involvesFunctionType()) {
// We already warned that \\param commands are not attached to a function
// decl.
return;
@@ -816,6 +816,14 @@
}
}
+bool Sema::involvesFunctionType() {
+ if (!ThisDeclInfo)
+ return false;
+ if (!ThisDeclInfo->IsFilled)
+ inspectThisDecl();
+ return ThisDeclInfo->involvesFunctionType();
+}
+
bool Sema::isFunctionDecl() {
if (!ThisDeclInfo)
return false;
Index: clang/lib/AST/Comment.cpp
===================================================================
--- clang/lib/AST/Comment.cpp
+++ clang/lib/AST/Comment.cpp
@@ -250,6 +250,7 @@
IsClassMethod = !IsInstanceMethod;
}
IsVariadic = FD->isVariadic();
+ assert(involvesFunctionType());
break;
}
case Decl::ObjCMethod: {
@@ -261,6 +262,7 @@
IsInstanceMethod = MD->isInstanceMethod();
IsClassMethod = !IsInstanceMethod;
IsVariadic = MD->isVariadic();
+ assert(involvesFunctionType());
break;
}
case Decl::FunctionTemplate: {
@@ -272,6 +274,7 @@
ReturnType = FD->getReturnType();
TemplateParameters = FTD->getTemplateParameters();
IsVariadic = FD->isVariadic();
+ assert(involvesFunctionType());
break;
}
case Decl::ClassTemplate: {
@@ -352,11 +355,11 @@
TypeLoc TL = TSI->getTypeLoc().getUnqualifiedLoc();
FunctionTypeLoc FTL;
if (getFunctionTypeLoc(TL, FTL)) {
- Kind = FunctionKind;
ParamVars = FTL.getParams();
ReturnType = FTL.getReturnLoc().getType();
if (const auto *FPT = FTL.getTypePtr()->getAs<FunctionProtoType>())
IsVariadic = FPT->isVariadic();
+ assert(involvesFunctionType());
}
}
Index: clang/include/clang/AST/CommentSema.h
===================================================================
--- clang/include/clang/AST/CommentSema.h
+++ clang/include/clang/AST/CommentSema.h
@@ -201,6 +201,10 @@
/// Emit diagnostics about unknown parametrs.
void resolveParamCommandIndexes(const FullComment *FC);
+ /// \returns \c true if the declaration that this comment is attached to
+ /// is a pointer to function/method/block type or has such a type.
+ bool involvesFunctionType();
+
bool isFunctionDecl();
bool isAnyFunctionDecl();
Index: clang/include/clang/AST/Comment.h
===================================================================
--- clang/include/clang/AST/Comment.h
+++ clang/include/clang/AST/Comment.h
@@ -1019,9 +1019,6 @@
/// \li member function template,
/// \li member function template specialization,
/// \li ObjC method,
- /// \li variable of function pointer, member function pointer or block type,
- /// \li a typedef for a function pointer, member function pointer,
- /// ObjC block.
FunctionKind,
/// Something that we consider a "class":
@@ -1089,6 +1086,8 @@
TemplateDeclKind getTemplateKind() const LLVM_READONLY {
return static_cast<TemplateDeclKind>(TemplateKind);
}
+
+ bool involvesFunctionType() const { return !ReturnType.isNull(); }
};
/// A full comment attached to a declaration, contains block content.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits