[clang] f5ba3d0 - [clang] Fix computeTypeLinkageInfo for dependent member pointers (#136689)
Andrew Savonichev via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 27 23:50:57 PDT 2025
Author: Andrew Savonichev
Date: 2025-04-28T15:49:54+09:00
New Revision: f5ba3d0c6d413e46fa962be80cfb37857e35b9ab
URL: https://github.com/llvm/llvm-project/commit/f5ba3d0c6d413e46fa962be80cfb37857e35b9ab
DIFF: https://github.com/llvm/llvm-project/commit/f5ba3d0c6d413e46fa962be80cfb37857e35b9ab.diff
LOG: [clang] Fix computeTypeLinkageInfo for dependent member pointers (#136689)
MemberPointerType may refer to a dependent class (qualifier), for
which getMostRecentCXXRecordDecl returns NULL. It seems that the
compiler never executed this code path before patch #136128 where the
issue was reported.
LIT tests 74 and 75 are reduced from Chromium and LLVM libc test
harness as reported in #136128.
Function member (test74):
MemberPointerType 'type-parameter-0-0 (type-parameter-0-1::*)(void)' dependent
|-TemplateTypeParmType 'type-parameter-0-1' dependent depth 0 index 1
`-FunctionProtoType 'type-parameter-0-0 (void)' dependent cdecl
`-TemplateTypeParmType 'type-parameter-0-0' dependent depth 0 index 0
Template parameter (test75):
MemberPointerType 'type-parameter-0-1 type-parameter-0-0::*' dependent
|-TemplateTypeParmType 'type-parameter-0-0' dependent depth 0 index 0
`-TemplateTypeParmType 'type-parameter-0-1' dependent depth 0 index 1
Added:
Modified:
clang/lib/AST/Type.cpp
clang/test/CodeGenCXX/visibility.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 111a642173418..d298f1cff73cf 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -4793,8 +4793,12 @@ LinkageInfo LinkageComputer::computeTypeLinkageInfo(const Type *T) {
return computeTypeLinkageInfo(cast<ReferenceType>(T)->getPointeeType());
case Type::MemberPointer: {
const auto *MPT = cast<MemberPointerType>(T);
- LinkageInfo LV =
- getDeclLinkageAndVisibility(MPT->getMostRecentCXXRecordDecl());
+ LinkageInfo LV;
+ if (auto *D = MPT->getMostRecentCXXRecordDecl()) {
+ LV.merge(getDeclLinkageAndVisibility(D));
+ } else if (auto *Ty = MPT->getQualifier()->getAsType()) {
+ LV.merge(computeTypeLinkageInfo(Ty));
+ }
LV.merge(computeTypeLinkageInfo(MPT->getPointeeType()));
return LV;
}
diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp
index e1061f3dbd18f..b4c6fdcbcdf33 100644
--- a/clang/test/CodeGenCXX/visibility.cpp
+++ b/clang/test/CodeGenCXX/visibility.cpp
@@ -1463,3 +1463,40 @@ namespace test71 {
// CHECK-HIDDEN-LABEL: define linkonce_odr hidden noundef i64 @_ZN6test713fooIlE3zedEv(
// CHECK-HIDDEN-LABEL: define linkonce_odr hidden noundef i32 @_ZN6test713fooIlE3barIiEET_v(
}
+
+namespace test74 {
+ template <typename> struct T;
+ template <typename R>
+ struct T<void (R::*)()> {
+ template <typename M>
+ static __attribute__((__visibility__("hidden"))) void Invoke(M) {
+ }
+ };
+
+ struct C;
+ void (C::*MM)();
+
+ void Fun() {
+ T<decltype(MM)>::Invoke(0);
+ }
+ // CHECK-LABEL: define linkonce_odr void @_ZN6test741TIMNS_1CEFvvEE6InvokeIiEEvT_(
+ // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test741TIMNS_1CEFvvEE6InvokeIiEEvT_(
+}
+
+namespace test75 {
+ template <class> struct T;
+ template <class C, class Ret>
+ struct T<Ret C::*> {
+ template <class M>
+ static __attribute__((__visibility__("hidden")))
+ void Invoke(M) {
+ }
+ };
+
+ struct A;
+ void Fun() {
+ T<void (A::*)()>::Invoke(0);
+ }
+ // CHECK-LABEL: define linkonce_odr void @_ZN6test751TIMNS_1AEFvvEE6InvokeIiEEvT_(
+ // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test751TIMNS_1AEFvvEE6InvokeIiEEvT_(
+}
More information about the cfe-commits
mailing list