[clang] [clang] Handle instantiated members to determine visibility (PR #136128)
Andrew Savonichev via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 20 01:25:43 PDT 2025
asavonic wrote:
Thanks a lot @jplehr and @DKLoehr for helping with reproducers, and @erichkeane for taking care of the revert.
The compiler trips on `LinkageComputer::computeTypeLinkageInfo` for `case Type::MemberPointer`, where only `CXXRecord` is expected, it seems.
We get a `FunctionProtoType` instead, so `getMostRecentCXXRecordDecl` returns NULL:
```
MemberPointerType 0x55555571ea90 'type-parameter-0-0 (type-parameter-0-1::*)(void)' dependent
|-TemplateTypeParmType 0x5555556f73b0 'type-parameter-0-1' dependent depth 0 index 1
`-FunctionProtoType 0x55555571e9e0 'type-parameter-0-0 (void)' dependent cdecl
`-TemplateTypeParmType 0x5555556f7630 'type-parameter-0-0' dependent depth 0 index 0
```
I'll figure out what to do with this case and send a new patch. The following helps to bypass the error, but perhaps we need to do something else for function types here.
```diff
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 42e94d66d1a1..28a5fdc4c3a8 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -4746,8 +4746,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()) {
+ LV.merge(getDeclLinkageAndVisibility(D));
+ }
LV.merge(computeTypeLinkageInfo(MPT->getPointeeType()));
return LV;
}
```
https://github.com/llvm/llvm-project/pull/136128
More information about the cfe-commits
mailing list