28 May 2026
Planet Mozilla
The Rust Programming Language Blog: Announcing Rust 1.96.0
The Rust team is happy to announce a new version of Rust, 1.96.0. Rust is a programming language empowering everyone to build reliable and efficient software.
If you have a previous version of Rust installed via rustup, you can get 1.96.0 with:
$ rustup update stable
If you don't have it already, you can get rustup from the appropriate page on our website, and check out the detailed release notes for 1.96.0.
If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (rustup default beta) or the nightly channel (rustup default nightly). Please report any bugs you might come across!
What's in 1.96.0 stable
New Range* types
Many users expect Range and related core::ops types to be Copy, but this is not the case: they implement Iterator directly, and it is a footgun to implement both Iterator and Copy on the same type so this has been avoided. RFC3550 proposed a set of replacement range types that implement IntoIterator rather than Iterator, meaning they can also be Copy. The standard library portion of that RFC is now stable, introducing:
core::range::Rangecore::range::RangeFromcore::range::RangeInclusive- Associated iterators
A Rust version in the near future will also add core::range::RangeFull and core::range::RangeTo as re-exports from core::ops (these do not implement Iterator and already implement Copy), and core::range::legacy::* as the new home for the current ranges. Range syntax like 0..1 still produces the legacy types for now, but will be updated to core::range types in a future edition.
With these stabilizations, it is now possible to store slice accessors in Copy types without splitting start and end:
use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range<usize>);
impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
}
The new RangeInclusive also makes its fields public, unlike the legacy version which avoided exposing the exhausted iterator state. This isn't a concern with the new type since it must be converted to begin iteration.
Library authors should consider making use of impl RangeBounds in public API, which accepts both legacy and new range types. If a concrete type is needed, prefer using new ranges as this will eventually become the default.
Assert matching patterns
The new macros assert_matches! and debug_assert_matches! check that a value matches a given pattern, panicking with a Debug representation of the value otherwise. These are essentially the same as assert!(matches!(..)) and debug_assert!(matches!(..)), but the printed value improves the possibility of diagnosing the failure.
These new macros have not been added to the standard prelude, because they would collide with popular third-party crates that provide macros with the same name. Instead, they should be manually imported from core or std before use.
use core::assert_matches;
/// [Random Number](https://xkcd.com/221/)
fn get_random_number() -> u32 {
// chosen by a fair dice roll.
// guaranteed to be random.
4
}
fn main() {
assert_matches!(get_random_number(), 1..=6);
}
Changes to WebAssembly targets
WebAssembly targets no longer pass --allow-undefined to the linker which means that undefined symbols when linking are now a linker error instead of being converted to WebAssembly imports from the "env" module. This change prevents modules from linking unless all linking-related symbols are defined to catch bugs earlier and prevent accidental issues with symbol naming or similar.
Undefined linking-related symbols are often indicative of build-time related bugs or misconfiguration. If, however, the old behavior is intended then it can be re-enabled with RUSTFLAGS=-Clink-arg=--allow-undefined or by editing the source code and using #[link(wasm_import_module = "env")] on the block defining the symbol.
This change was previously announced on this blog, and now takes effect in Rust 1.96.
Stabilized APIs
assert_matches!debug_assert_matches!From<T> for AssertUnwindSafe<T>From<T> for LazyCell<T, F>From<T> for LazyLock<T, F>core::range::RangeToInclusivecore::range::RangeToInclusiveItercore::range::RangeFromcore::range::RangeFromItercore::range::Rangecore::range::RangeIter
Two Cargo advisories
Rust 1.96 contains fixes for two vulnerabilities for users of third-party registries.
-
CVE-2026-5223 is a medium severity vulnerability regarding extraction of crate tarballs with symlinks.
-
CVE-2026-5222 is a low severity vulnerability regarding authentication with normalized URLs.
Users of crates.io are not affected by either vulnerability.
Other changes
Check out everything that changed in Rust, Cargo, and Clippy.
Contributors to 1.96.0
Many people came together to create Rust 1.96.0. We couldn't have done it without all of you. Thanks!
28 May 2026 12:00am GMT
27 May 2026
Planet Mozilla
Firefox Tooling Announcements: New Deploy of PerfCompare (May 27th)
The latest version of PerfCompare is now live!
Check out the change-log below to see the updates:
[kala-moz]:
-
Bug 2036968: Replaced fast-kde with fftkde and used bootstrap-ci to get CI summary (#1034)
-
Bug 2037551: Reduced the size of perfcompare hero on Results Page (#1036)
[padenot]: Use SJ bandwidth for top-level results, ISJ for subtests
[shtrom]: Bug 2014041: add support for landoInstance QueryString parameter (#1038)
Thank you for the contributions!
Bugs or feature requests can be filed on Bugzilla. The team can also be found on the #perfcompare channel on Element. Come and chat!
1 post - 1 participant
27 May 2026 9:29pm GMT
This Week In Rust: This Week in Rust 653
Hello and welcome to another issue of This Week in Rust! Rust is a programming language empowering everyone to build reliable and efficient software. This is a weekly summary of its progress and community. Want something mentioned? Tag us at @thisweekinrust.bsky.social on Bluesky or @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub and archives can be viewed at this-week-in-rust.org. If you find any errors in this week's issue, please submit a PR.
Want TWIR in your inbox? Subscribe here.
Updates from Rust Community
Newsletters
Project/Tooling Updates
- gitoxide - May 26
- hyper User Survey 2025 Results
- Rust Update: gRPC Welcomes Tonic!
- serde-const-default v0.1: Removes boilerplate when using const values as field defaults
- BoquilaHUB 0.5: AIs for Nature. Now it includes SOTA AI bioacoustics models and embeddings models
- splog: a log viewer TUI with automatic tag categorization
- rgx v0.12.3 - Building a regex debugger for the terminal in Rust
- UI tests are the guardrails an AI needs: the story of clipboardwire
- slintcn 0.22: shadcn/ui-style copy-paste components for Slint native apps
- Releasing dtact v0.2.2 and rssn-advanced v0.1.0: the next generation async concurrent engine and scientific computing engine
Observations/Thoughts
- Noroboto: Lying Fonts and Mitigation in Rust
- Erasing Existentials
- libwce: the entropy layer of a wavelet codec, on its own
- Tech Notes: Theseus: translating win32 to wasm
- Bevy Game Engine Explained Visually
- The reflex of deriving
serdetraits - Physical AI Needs a Typed World Model, Not a Vector DB
- Keep calm and use (Rust) monorepos
- [audio] Rust for Linux Live with Alice Ryhl and Greg Kroah-Hartman
- [audio] Netstack.FM episode 38 - Building and testing network stacks with Rama
- [video] Can a QR code be made of stars?
Rust Walkthroughs
- Rust Patterns & Engineering How-Tos
- Laissez-Faire Errors
- Learn Rust HashMap and Iterators by Building a Git Object Store Reader
- Learn the Basics of Bevy by Building and Deploying Pong to Itch.io
- The Slowdown That Doesn't Show Up in Profiles
- Building an AsyncIO executor for the 3DS
- [video] Nine Ways to do Inheritance in Rust, a Language without Inheritance
Miscellaneous
Crate of the Week
This week's crate is inline_tweak, a crate to embed tweakable constants inside your Rust application without full recompilation.
Thanks to Kill The Mule for the suggestion!
Please submit your suggestions and votes for next week!
Calls for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization.
If you are a feature implementer and would like your RFC to appear in this list, add a call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
No calls for testing were issued this week by Rust, Cargo, Rustup or Rust language RFCs.
Let us know if you would like your feature to be tracked as a part of this list.
Call for Participation; projects and speakers
CFP - Projects
Always wanted to contribute to open-source projects but did not know where to start? Every week we highlight some tasks from the Rust community for you to pick and get started!
Some of these tasks may also have mentors available, visit the task page for more information.
If you are a Rust project owner and are looking for contributors, please submit tasks here or through a PR to TWiR or by reaching out on Bluesky or Mastodon!
CFP - Events
Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.
- No Calls for papers or presentations were submitted this week.
If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a PR to TWiR or by reaching out on Bluesky or Mastodon!
Updates from the Rust Project
352 pull requests were merged in the last week
Compiler
rustc_on_unimplemented: introduce format specifiers- account for proc macro spans in
do_not_recommenddiagnostics - implement fast path for
derive(PartialOrd)when derivingOrd - make bitset
would_modify_wordsmore vectorzer-friendly - parse
mutrestrictions - stop needing materialized places for most intrinsics
Library
Cargo
- compiler: forward verbose flag to rustc for local crates
- don't use the network for a publish dry-run test
- break out
RegistryConfigandcrate_urlfor interpretingRegistryConfig::dl - fix CVE-2026-5222 and CVE-2026-5223
- artifact: remove compat mode from artifacts
Rustdoc
Clippy
useless_format: fire on wrapped in a block-producing macroreturncan be removed from the last stmt of a block if it has an expr- add check for midpoint using multiplication by
0.5and>> 1 - avoid unnecessary
Stringallocations inMinifyingSuggarithmetic ops - extend
clippy::missing_safety_docto unsafe fields - fix
manual_range_containsNAN handling - fix error message for
useless_borrows_in_formattingfor mutable borrows - move
unnecessary_get_then_checktocomplexity - simplify
is_some() && …unwrap()tois_some_andinunit_arg
Rust-Analyzer
diagnostics: mut_refbinding feature diagnosticassists/add_reference_here: _modify_the reference type when dealing with&T->&mut Tcfg: correct separator index in CfgDiff disable loophir-ty: saturate float-to-uint cast in const evaltest-utils: draininactive_regionsbyinactive_line_region- add diagnostic for E0033
- add diagnostic for E0608
- completions imports exclude supports sub items
- filter package-scoped features
extract_modulemissing import for macro calls- add
type_matchscore forstruct_pat - allow wildcard params in foreign fn declarations
- analysis expected ty in
enumvariant - autoimport
enumvariants - do not autoref in method probe in path mode
- do not complete semicolon in match-expr place
- do not consider the path of the macro in a macro call to be inside a macro call
- emit diagnostic for rest array patterns without fixed-length arrays
- fix
SyntaxContext::roots technically overlapping valid interneds - flip
coerce_never type_mismatchtys - have a specific error for unimplemented builtin macros
- no suggest ref match when expected generic ref
- no use sad pattern on happy arm with guard
- normalize expected tuple
structpat field - refactor handling of generic params in
hir::Type - support named consts in range pattern types
- use grouped annotation for
add_label_to_loop - provide better incrementality for modules
Rust Compiler Performance Triage
This week was largely positive, with most of the improvements coming from algorithm change in visibility checking: #156228.
Triage done by @panstromek. Revision range: 281c97c3..783eb8c8
Summary:
| (instructions:u) | mean | range | count |
|---|---|---|---|
| Regressions ❌ (primary) |
0.4% | [0.1%, 0.7%] | 5 |
| Regressions ❌ (secondary) |
0.5% | [0.1%, 1.1%] | 16 |
| Improvements ✅ (primary) |
-0.9% | [-6.6%, -0.1%] | 164 |
| Improvements ✅ (secondary) |
-0.4% | [-1.3%, -0.1%] | 51 |
| All ❌✅ (primary) | -0.9% | [-6.6%, 0.7%] | 169 |
2 Regressions, 2 Improvements, 5 Mixed; 2 of them in rollups 34 artifact comparisons made in total
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
Tracking Issues & PRs
- Promotes 5 Thumb-mode bare-metal Arm targets to Tier 2
- Add -Z dead-fn-elimination to skip codegen of BFS-unreachable functions
- Update
transmute_copyto ub_checks and?Sized - Tracking Issue for NEON dot product intrinsics
- Never break between empty parens
No Items entered Final Comment Period this week for Cargo, Language Team, Language Reference or Leadership Council. Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.
New and Updated RFCs
- No New or Updated RFCs were created this week.
Upcoming Events
Rusty Events between 2026-05-27 - 2026-06-24 🦀
Virtual
- 2026-05-27 | Virtual (Girona, ES) | Rust Girona
- 2026-06-02 | Virtual | libp2p Events
- 2026-06-02 | Virtual (Tel Aviv-yafo, IL) | Rust 🦀 TLV
- 2026-06-03 | Virtual (Indianapolis, IN, US) | Indy Rust
- 2026-06-04 | Virtual (Berlin, DE) | Rust Berlin
- 2026-06-04 | Virtual (Nürnberg, DE) | Rust Nuremberg
- 2026-06-04 | Virtual (Tel Aviv-yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
- 2026-06-06 | Virtual (Kampala, UG) | Rust Circle Meetup
- 2026-06-07 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-06-09 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-06-10 | Virtual (Girona, ES) | Rust Girona
- 2026-06-16 | Virtual (Washington, DC, US) | Rust DC
- 2026-06-17 | Hybrid (Vancouver, BC, CA) | Vancouver Rust
- 2026-06-17 | Virtual (Girona, ES) | Rust Girona
- 2026-06-18 | Hybrid (Seattle, WA, US) | Seattle Rust User Group
- 2026-06-18 | Virtual (Berlin, DE) | Rust Berlin
- 2026-06-21 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-06-23 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-06-23 | Virtual (London, UK) | Women in Rust
Asia
- 2026-06-02 | Beijing, CN | Voice AI and Rust Meetup (Rust for AI, lowcoderust.com)
Europe
- 2026-05-28 | Copenhagen, DK | Copenhagen Rust Community
- 2026-05-28 | London, UK | Rust London User Group
- 2026-05-29 | Berlin, DE | Rust Berlin
- 2026-05-30 | Stockholm, SE | Stockholm Rust
- 2026-06-02 | Frankfurt, DE | Rust Rhein-Main
- 2026-06-03 | Dublin, IE | Rust Dublin
- 2026-06-03 | Girona, ES | Rust Girona
- 2026-06-10 | München, DE | Rust Munich
- 2026-06-11 | Switzerland, CH | PostTenebrasLab
- 2026-06-12 - 2026-06-14 | Kraków, PL | Rustmeet
- 2026-06-16 | Leipzig, DE | Rust - Modern Systems Programming in Leipzig
- 2026-06-16 | Milano, IT | Rust Language Milan
- 2026-06-18 | Aarhus, DK | Rust Aarhus
North America
- 2026-05-27 | Austin, TX, US | Rust ATX
- 2026-05-28 | Atlanta, GA, US | Rust Atlanta
- 2026-05-28 | Los Angeles, CA, US | Rust Los Angeles
- 2026-05-28 | Mountain View, CA, US | Hacker Dojo
- 2026-05-30 | Boston, MA, US | Boston Rust Meetup
- 2026-06-04 | Saint Louis, MO, US | STL Rust
- 2026-06-06 | Boston, MA, US | Boston Rust Meetup
- 2026-06-11 | Lehi, UT, US | Utah Rust
- 2026-06-11 | Mountain View, CA, US | Hacker Dojo
- 2026-06-11 | San Diego, CA, US | San Diego Rust
- 2026-06-16 | San Francisco, CA, US | San Francisco Rust Study Group
- 2026-06-17 | Hybrid (Vancouver, BC, CA) | Vancouver Rust
- 2026-06-18 | Hybrid (Seattle, WA, US) | Seattle Rust User Group
- 2026-06-24 | Austin, TX, US | Rust ATX
- 2026-06-24 | Los Angeles, CA, US | Rust Los Angeles
South America
- 2026-06-18 | Florianópolis, BR | Rust SC
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
This overflows the trait solver today as well as my brain
Thanks to Theemathas for the suggestion!
Please submit quotes and vote for next week!
This Week in Rust is edited by:
- nellshamrell
- llogiq
- ericseppanen
- extrawurst
- U007D
- mariannegoldin
- bdillo
- opeolluwa
- bnchi
- KannanPalani57
- tzilist
Email list hosting is sponsored by The Rust Foundation
27 May 2026 4:00am GMT