@@ -524,7 +524,7 @@ class VisitorBuilder : private detail::VisitorBuilderBase {
524524 detail::VisitorCallbackData data{};
525525 static_assert (sizeof (fn) <= sizeof (data.data ));
526526 memcpy (&data.data , &fn, sizeof (fn));
527- VisitorBuilderBase::add (key, &VisitorBuilder::setForwarder <ReturnT>, data);
527+ VisitorBuilderBase::add (key, &VisitorBuilder::setMemberFnForwarder <ReturnT>, data);
528528 }
529529
530530 template <typename OpT, typename ReturnT>
@@ -576,6 +576,21 @@ class VisitorBuilder : private detail::VisitorBuilderBase {
576576 return (self->*fn)(*llvm::cast<OpT>(op));
577577 }
578578 }
579+
580+ template <typename ReturnT>
581+ static VisitorResult
582+ setMemberFnForwarder (const detail::VisitorCallbackData &data, void *payload,
583+ llvm::Instruction *op) {
584+ ReturnT (PayloadT::*fn)(llvm::Instruction &);
585+ memcpy (&fn, &data.data , sizeof (fn));
586+ PayloadT *self = static_cast <PayloadT *>(payload);
587+ if constexpr (std::is_same_v<ReturnT, void >) {
588+ (self->*fn)(*op);
589+ return VisitorResult::Continue;
590+ } else {
591+ return (self->*fn)(*op);
592+ }
593+ }
579594};
580595
581596} // namespace llvm_dialects
0 commit comments