The Rust team recently released Rust 1.86, introducing a notable new feature: trait upcasting. This capability allows developers to coerce a reference to a trait object into a reference to a supertrait object, simplifying type conversions and improving code flexibility. Trait upcasting has been a long-anticipated addition and is now fully stabilized, making it easier to work with hierarchical trait relationships in Rust.
Trait upcasting is particularly useful when working with supertraits—traits that must be implemented for a type to satisfy another trait. One practical application is with the Any
trait, where upcasting to dyn Any
allows developers to call downcast methods without needing to add extra trait methods or rely on external crates. This enhancement makes Rust’s type system more expressive and ergonomic, especially in complex polymorphic scenarios.
Beyond trait upcasting, Rust 1.86 introduces improvements in mutable indexing for collections like HashMap
and slices. Developers can now obtain mutable references to multiple elements simultaneously through the new get_disjoint_mut
helper method. This feature respects Rust’s strict borrow checker rules, ensuring memory safety while enabling more efficient manipulation of collections.
Additionally, the Rust compiler now includes debug assertions to check that pointers are not null during non-zero-sized reads, writes, and reborrowing, increasing runtime safety. Other updates include the stabilization of the target_feature_11
attribute for marking safe functions with specific CPU features, and new lint warnings for omitting ABIs in extern
blocks. Finally, the team announced that support for the tier-2 target i586-pc-windows-msvc
will be dropped in the upcoming Rust 1.87 release, marking a continued focus on maintaining and streamlining supported platforms.