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.

