Revert "[clang] Handle instantiated members to determine visibility" (#136317)
Reverts llvm/llvm-project#136128
See discussion here:
https://github.com/llvm/llvm-project/pull/136128#issuecomment-2815648110
and :
https://github.com/llvm/llvm-project/pull/136128#issuecomment-2815652846
@asavonic can re-submit once the examples provided by @jplehr and/or
@DKLoehr are fixed.
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index b596198..ad1cb01 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -400,9 +400,9 @@
FunctionTemplateDecl *temp = specInfo->getTemplate();
// Merge information from the template declaration.
LinkageInfo tempLV = getLVForDecl(temp, computation);
- // The linkage and visibility of the specialization should be
- // consistent with the template declaration.
- LV.mergeMaybeWithVisibility(tempLV, considerVisibility);
+ // The linkage of the specialization should be consistent with the
+ // template declaration.
+ LV.setLinkage(tempLV.getLinkage());
// Merge information from the template parameters.
LinkageInfo paramsLV =
@@ -1051,13 +1051,6 @@
if (const auto *redeclTemp = dyn_cast<RedeclarableTemplateDecl>(temp)) {
if (isExplicitMemberSpecialization(redeclTemp)) {
explicitSpecSuppressor = temp->getTemplatedDecl();
- } else if (const RedeclarableTemplateDecl *from =
- redeclTemp->getInstantiatedFromMemberTemplate()) {
- // If no explicit visibility is specified yet, and this is an
- // instantiated member of a template, look up visibility there
- // as well.
- LinkageInfo fromLV = from->getLinkageAndVisibility();
- LV.mergeMaybeWithVisibility(fromLV, considerVisibility);
}
}
}
diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp
index b69278a..e1061f3 100644
--- a/clang/test/CodeGenCXX/visibility.cpp
+++ b/clang/test/CodeGenCXX/visibility.cpp
@@ -1457,45 +1457,9 @@
// CHECK-LABEL: declare hidden noundef i32 @_ZN6test713fooIiE3zedEv(
// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN6test713fooIiE3barIiEET_v(
// CHECK-LABEL: define linkonce_odr hidden noundef i64 @_ZN6test713fooIlE3zedEv(
- // CHECK-LABEL: define linkonce_odr hidden noundef i32 @_ZN6test713fooIlE3barIiEET_v(
+ // CHECK-LABEL: define linkonce_odr noundef i32 @_ZN6test713fooIlE3barIiEET_v(
// CHECK-HIDDEN-LABEL: declare hidden noundef i32 @_ZN6test713fooIiE3zedEv(
// CHECK-HIDDEN-LABEL: define linkonce_odr noundef i32 @_ZN6test713fooIiE3barIiEET_v(
// CHECK-HIDDEN-LABEL: define linkonce_odr hidden noundef i64 @_ZN6test713fooIlE3zedEv(
// CHECK-HIDDEN-LABEL: define linkonce_odr hidden noundef i32 @_ZN6test713fooIlE3barIiEET_v(
}
-
-// https://github.com/llvm/llvm-project/issues/103477
-namespace test72 {
- template <class a>
- struct t {
- template <int>
- static HIDDEN void bar() {}
- };
-
- void test() {
- t<char>::bar<1>();
- }
- // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test721tIcE3barILi1EEEvv(
- // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test721tIcE3barILi1EEEvv(
-}
-
-// https://github.com/llvm/llvm-project/issues/31462
-namespace test73 {
- template <class T> struct s {
- template <class U>
- __attribute__((__visibility__("hidden"))) U should_not_be_exported();
- };
-
- template <class T> template <class U> U s<T>::should_not_be_exported() {
- return U();
- }
-
- extern template struct __attribute__((__visibility__("default"))) s<int>;
-
- int f() {
- s<int> o;
- return o.should_not_be_exported<int>();
- }
- // CHECK-LABEL: define linkonce_odr noundef i32 @_ZN6test731sIiE22should_not_be_exportedIiEET_v(
- // CHECK-HIDDEN-LABEL: define linkonce_odr noundef i32 @_ZN6test731sIiE22should_not_be_exportedIiEET_v(
-}