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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to