rsmith added a comment. Please factor out the fix for `getTemplateInstantiationPattern` and commit it separately. https://reviews.llvm.org/D25942 has a testcase for that portion of this change.
================ Comment at: lib/AST/Decl.cpp:1057-1058 + RD->getTemplateInstantiationPattern(); + if (!InstantiatedFrom) + InstantiatedFrom = RD->getInstantiatedFromMemberClass(); if (InstantiatedFrom) ---------------- This doesn't seem to match GCC; GCC seems to do this for all kinds of member specialization, not just for member class specialization: ``` template<typename T> struct A { template<typename U> struct __attribute__((visibility("hidden"))) B; }; template<> template<typename U> struct A<int>::B { virtual void f() {} }; void g() { A<int>::B<int>().f(); } ``` Here, A<int>::B<int> gets hidden visibility, even though it was instantiated from the member template specialization `A<int>::B` which had no visibility attribute. I don't know what the underlying logic is here -- does GCC look at the visibility on the enclosing class when computing visibility for a member class? -- but I don't think this one special case covers it. ================ Comment at: lib/AST/Decl.cpp:1096-1097 + FunctionDecl *InstantiatedFrom = fn->getTemplateInstantiationPattern(); + if (!InstantiatedFrom) + InstantiatedFrom = fn->getInstantiatedFromMemberFunction(); ---------------- Likewise. ================ Comment at: lib/AST/DeclCXX.cpp:1349-1354 + while (!CTD->isMemberSpecialization()) { + auto *NewCTD = CTD->getInstantiatedFromMemberTemplate(); + if (!NewCTD) break; CTD = NewCTD; } ---------------- The same bug exists in `VarDecl::getTemplateInstantiationPattern`; can you fix it there too? Repository: rL LLVM https://reviews.llvm.org/D13419 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits