[Mlir-commits] [mlir] [mlir] fix Undefined behavior in CastInfo::castFailed with From=<MLIRinterface> (PR #87145)
River Riddle
llvmlistbot at llvm.org
Mon Oct 28 09:53:20 PDT 2024
================
@@ -2142,6 +2143,83 @@ struct DenseMapInfo<T,
}
static bool isEqual(T lhs, T rhs) { return lhs == rhs; }
};
+
+/// Add support for llvm style casts.
+/// We provide a cast between To and From if To and From is mlir::OpInterface or
+/// derives from it.
+template <typename To, typename From>
+struct CastInfo<
+ To, From,
+ std::enable_if_t<
+ std::is_base_of_v<mlir::OpInterface<To, typename To::InterfaceTraits>,
+ To> &&
+ std::is_base_of_v<mlir::OpInterface<std::remove_const_t<From>,
+ typename std::remove_const_t<
+ From>::InterfaceTraits>,
+ std::remove_const_t<From>>,
+ void>> : NullableValueCastFailed<To>,
+ DefaultDoCastIfPossible<To, From, CastInfo<To, From>> {
+
+ static inline bool isPossible(From &val) {
+ if constexpr (std::is_same_v<To, From>)
+ return true;
+ else
+ return mlir::OpInterface<To, typename To::InterfaceTraits>::
+ InterfaceBase::classof(
+ const_cast<std::remove_const_t<From> &>(val).getOperation());
----------------
River707 wrote:
Why call into classof instead of invoking `isa<To>(val.getOperation())`?
https://github.com/llvm/llvm-project/pull/87145
More information about the Mlir-commits
mailing list