[clang] Reland [clang] Handle instantiated members to determine visibility (#136128) (PR #136689)

Andrew Savonichev via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 22 07:09:18 PDT 2025


================
@@ -4787,8 +4787,10 @@ 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 (CXXRecordDecl *D = MPT->getMostRecentCXXRecordDecl()) {
----------------
asavonic wrote:

> Is the issue here that now additional cases are called from `mergeMaybeWithVisibility`.

Yes. Starting from `LinkageInfo fromLV = from->getLinkageAndVisibility();` we eventually reach

```
if (const auto *spec = dyn_cast<ClassTemplateSpecializationDecl>(Tag)) {
  mergeTemplateLV(LV, spec, computation);
```
where spec is:
```
ClassTemplatePartialSpecializationDecl 0x55555571ebf0 <repro.cpp:24:1, line:29:1> line:25:8 struct DecayedFunctorTraits definition explicit_specialization
[...]
|-TemplateArgument type 'type-parameter-0-0 (type-parameter-0-1::*)()'
| `-MemberPointerType 0x55555571ea90 'type-parameter-0-0 (type-parameter-0-1::*)()' dependent
|   |-TemplateTypeParmType 0x5555556f73b0 'type-parameter-0-1' dependent depth 0 index 1
|   `-FunctionProtoType 0x55555571e9e0 'type-parameter-0-0 ()' dependent cdecl
|     `-TemplateTypeParmType 0x5555556f7630 'type-parameter-0-0' dependent depth 0 index 0
[...]
```

> How can we have a case where there is no record decl for a member pointer?

MemberPointerType seems to be both for data members or functions. Or I guess it can be neither if is a template parameter? (see test75)
https://github.com/llvm/llvm-project/blob/cfeaa395970b7a2a2f0389d06a20d0970d591807/clang/include/clang/AST/Type.h#L3567

https://github.com/llvm/llvm-project/pull/136689


More information about the cfe-commits mailing list