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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits