https://gcc.gnu.org/g:eb7dffae860b30215382f2f58a9f22932122ce96
commit eb7dffae860b30215382f2f58a9f22932122ce96 Author: Jakub Dupak <d...@jakubdupak.com> Date: Mon Dec 11 23:11:34 2023 +0100 TyTy: SubstitutionRef cast specialization Allows skipping parent check when casting. gcc/rust/ChangeLog: * typecheck/rust-tyty.h (BaseType::is): Cast API. (SubstitutionRef>): Cast API. (BaseType::as): Cast API. (BaseType::try_as): Cast API. Signed-off-by: Jakub Dupak <d...@jakubdupak.com> Diff: --- gcc/rust/typecheck/rust-tyty.h | 78 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index dcf46300dfc2..c9eb12cda9e9 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -1575,6 +1575,84 @@ BaseType::is<const CallableTypeInterface> () const return this->is<CallableTypeInterface> (); } +template <> +WARN_UNUSED_RESULT inline bool +BaseType::is<SubstitutionRef> () const +{ + auto kind = this->get_kind (); + return kind == FNPTR || kind == FNDEF || kind == CLOSURE || kind == ADT + || kind == PROJECTION; +} + +template <> +WARN_UNUSED_RESULT inline bool +BaseType::is<const SubstitutionRef> () const +{ + return this->is<SubstitutionRef> (); +} + +template <> +WARN_UNUSED_RESULT inline SubstitutionRef * +BaseType::as<SubstitutionRef> () +{ + auto kind = this->get_kind (); + switch (kind) + { + case FNDEF: + return static_cast<FnType *> (this); + case CLOSURE: + return static_cast<ClosureType *> (this); + case ADT: + return static_cast<ADTType *> (this); + case PROJECTION: + return static_cast<ProjectionType *> (this); + default: + rust_unreachable (); + } +} + +template <> +WARN_UNUSED_RESULT inline const SubstitutionRef * +BaseType::as<const SubstitutionRef> () const +{ + auto kind = this->get_kind (); + switch (kind) + { + case FNDEF: + return static_cast<const FnType *> (this); + case CLOSURE: + return static_cast<const ClosureType *> (this); + case ADT: + return static_cast<const ADTType *> (this); + case PROJECTION: + return static_cast<const ProjectionType *> (this); + default: + rust_unreachable (); + } +} + +template <> +WARN_UNUSED_RESULT inline SubstitutionRef * +BaseType::try_as<SubstitutionRef> () +{ + if (this->is<SubstitutionRef> ()) + { + return this->as<SubstitutionRef> (); + } + return nullptr; +} + +template <> +WARN_UNUSED_RESULT inline const SubstitutionRef * +BaseType::try_as<const SubstitutionRef> () const +{ + if (this->is<const SubstitutionRef> ()) + { + return this->as<const SubstitutionRef> (); + } + return nullptr; +} + } // namespace TyTy } // namespace Rust