[PATCH] D153835: [Sema] Clone VisibilityAttr for functions in template instantiations
Fangrui Song via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 6 19:13:32 PDT 2023
MaskRay added a comment.
In D153835#4478700 <https://reviews.llvm.org/D153835#4478700>, @efriedma wrote:
> Can you write the complete rule we're trying to follow here? Like, if you have a free function template, prioritize attributes in the following order ..., if you have a member function, use the following order ..., etc. I know that's a significant amount of writing, but I don't really have any intuition here about how it should work. So I'm not sure how to review this without a reference. (The closest thing I have to intuition is comparing the rules to the ones for C++ anonymous namespaces, but visibility is a lot more complicated.)
The rules are quite complex and sorry that I am unable to describe them...
> Given how complicated the rules are here, it might be easier to understand if you teach the relevant code in clang/lib/AST/Decl.cpp (getExplicitVisibilityAux, I think?) to explicitly check for attributes on the original template, instead of cloning the attribute.
If we don't clone `VisibilityAttr`, the best I can come up with is the following patch
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -375,6 +375,9 @@ static bool shouldConsiderTemplateVisibility(const FunctionDecl *fn,
if (!specInfo->isExplicitInstantiationOrSpecialization())
return true;
+ if (specInfo->getTemplate()->getTemplatedDecl()->hasAttr<VisibilityAttr>())
+ return false;
+
return !fn->hasAttr<VisibilityAttr>();
}
test71 still fails (while this patch fixes test71). Here is my observation:
As confirmed by `-fsyntax-only -Xclang -ast-dump`, the explicit instantiation declaration (`extern template struct DEFAULT foo<int>;`) clones the `FunctionTemplateDecl` tree (including `CXXMethodDecl`) without cloning `VisibilityAttr`. This causes all `hasAttr<VisibilityAttr>()` code to behave incorrectly like the status quo.
I think this `VisibilityAttr` cloning patch matches GCC's spirit better and will enable simplification of the complex template instantiation/specialization rules.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153835/new/
https://reviews.llvm.org/D153835
More information about the cfe-commits
mailing list