From 5b901623a88b951a653a0bb1027b9c64645f52e1 Mon Sep 17 00:00:00 2001 From: lujiao Date: Tue, 5 May 2026 18:01:12 +0800 Subject: [PATCH] Should use member function pointer callback Function callback is wrong for the member function pointer --- include/llvm-dialects/Dialect/Visitor.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/include/llvm-dialects/Dialect/Visitor.h b/include/llvm-dialects/Dialect/Visitor.h index 41568ac..4975cc9 100644 --- a/include/llvm-dialects/Dialect/Visitor.h +++ b/include/llvm-dialects/Dialect/Visitor.h @@ -524,7 +524,7 @@ class VisitorBuilder : private detail::VisitorBuilderBase { detail::VisitorCallbackData data{}; static_assert(sizeof(fn) <= sizeof(data.data)); memcpy(&data.data, &fn, sizeof(fn)); - VisitorBuilderBase::add(key, &VisitorBuilder::setForwarder, data); + VisitorBuilderBase::add(key, &VisitorBuilder::setMemberFnForwarder, data); } template @@ -576,6 +576,21 @@ class VisitorBuilder : private detail::VisitorBuilderBase { return (self->*fn)(*llvm::cast(op)); } } + + template + static VisitorResult + setMemberFnForwarder(const detail::VisitorCallbackData &data, void *payload, + llvm::Instruction *op) { + ReturnT (PayloadT::*fn)(llvm::Instruction &); + memcpy(&fn, &data.data, sizeof(fn)); + PayloadT *self = static_cast(payload); + if constexpr (std::is_same_v) { + (self->*fn)(*op); + return VisitorResult::Continue; + } else { + return (self->*fn)(*op); + } + } }; } // namespace llvm_dialects