Skip to content

Commit 678c2a9

Browse files
jiaoluFlakebi
authored andcommitted
Should use member function pointer callback
Function callback is wrong for the member function pointer
1 parent aed217e commit 678c2a9

1 file changed

Lines changed: 16 additions & 1 deletion

File tree

include/llvm-dialects/Dialect/Visitor.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)