llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
25.95k stars 10.6k forks source link

Remove calls to `isa/dyn_cast/cast/...` member functions. #90453

Closed chsigg closed 2 weeks ago

chsigg commented 2 weeks ago

Also remove the member overload in TypeSwitch.

llvmbot commented 2 weeks ago

@llvm/pr-subscribers-llvm-adt @llvm/pr-subscribers-mlir

@llvm/pr-subscribers-mlir-core

Author: Christian Sigg (chsigg)

Changes Also remove the member overload in TypeSwitch. --- Full diff: https://github.com/llvm/llvm-project/pull/90453.diff 2 Files Affected: - (modified) llvm/include/llvm/ADT/TypeSwitch.h (+2-22) - (modified) mlir/include/mlir/Tools/PDLL/AST/Types.h (+23) ``````````diff diff --git a/llvm/include/llvm/ADT/TypeSwitch.h b/llvm/include/llvm/ADT/TypeSwitch.h index 10a2d48e918db9..5bbbdf23b257ed 100644 --- a/llvm/include/llvm/ADT/TypeSwitch.h +++ b/llvm/include/llvm/ADT/TypeSwitch.h @@ -61,29 +61,9 @@ template class TypeSwitchBase { } protected: - /// Trait to check whether `ValueT` provides a 'dyn_cast' method with type - /// `CastT`. - template - using has_dyn_cast_t = - decltype(std::declval().template dyn_cast()); - - /// Attempt to dyn_cast the given `value` to `CastT`. This overload is - /// selected if `value` already has a suitable dyn_cast method. + /// Attempt to dyn_cast the given `value` to `CastT`. template - static decltype(auto) castValue( - ValueT &&value, - std::enable_if_t::value> * = - nullptr) { - return value.template dyn_cast(); - } - - /// Attempt to dyn_cast the given `value` to `CastT`. This overload is - /// selected if llvm::dyn_cast should be used. - template - static decltype(auto) castValue( - ValueT &&value, - std::enable_if_t::value> * = - nullptr) { + static decltype(auto) castValue(ValueT &&value) { return dyn_cast(value); } diff --git a/mlir/include/mlir/Tools/PDLL/AST/Types.h b/mlir/include/mlir/Tools/PDLL/AST/Types.h index 03252e9f6620c8..1aff7a1d0a8406 100644 --- a/mlir/include/mlir/Tools/PDLL/AST/Types.h +++ b/mlir/include/mlir/Tools/PDLL/AST/Types.h @@ -323,6 +323,29 @@ struct DenseMapInfo { return lhs == rhs; } }; + +/// Add support for llvm style casts. +/// We provide a cast between To and From if From is mlir::pdll::ast::Type or +/// derives from it +template +struct CastInfo< + To, From, + std::enable_if_t< + std::is_same_v> || + std::is_base_of_v>> + : NullableValueCastFailed, + DefaultDoCastIfPossible> { + static inline bool isPossible(mlir::pdll::ast::Type ty) { + /// Return a constant true instead of a dynamic true when casting to self or + /// up the hierarchy. + if constexpr (std::is_base_of_v) { + return true; + } else { + return To::classof(ty); + }; + } + static inline To doCast(mlir::pdll::ast::Type ty) { return To(ty.getImpl()); } +}; } // namespace llvm #endif // MLIR_TOOLS_PDLL_AST_TYPES_H_ ``````````
chsigg commented 2 weeks ago

This has landed in PR #90413. Closing.