The Rust 2026 edition isn't being designed in a vacuum. It's being designed in the Linux kernel.
Field projections and in-place initialization β two of the flagship features planned for 2026 β exist because Rust needs to work inside a piece of software that runs on billions of devices. The kernel doesn't care about ergonomic async iteration. It cares about memory layout, stack usage, and pinned pointers. That's exactly what these features solve.
The Problem Field Projections Solve
If you've ever tried to access a field through a Pin<&mut T> or MaybeUninit<T>, you've hit the wall. The compiler sees the wrapper, not the field. You end up with unsafe code just to get a pointer to a struct's second field.
// Current workaround: manual pointer math
struct Packet {
header: Header,
payload: [u8; 1024],
}
let mut packet = Pin::new(&mut pkt);
let payload_ptr: *mut [u8; 1024] = unsafe {
(packet.get_unchecked_mut() as *mut Packet).add(0) as *mut [u8; 1024]
};
Field projections would let the compiler understand that Pin<&mut Packet> can project to Pin<&mut Packet::payload> β safely, with zero unsafe code. The compiler already knows the memory layout. It just needs a way to express the projection.
In-Place Initialization: No More Stack Copies
The second big feature is in-place initialization. Right now, if you have a large struct on the heap and want to initialize it field by field, Rust moves it onto the stack first. For most code, this is fine. For kernel code, it's a dealbreaker β the stack is precious, and many kernel types can't be moved once constructed (they're pinned).
In-place initialization means the bits land directly where they belong, never touching the caller's stack frame.
Why This Matters Outside the Kernel
You don't write kernel drivers. But you might write:
- Embedded systems with tight stack budgets
- High-performance game engines managing thousands of entities
- WASM modules where every byte of stack matters
The same constraints that drive Rust-for-Linux eventually leak into your code. The 2026 edition isζεζ³ι² (pre-leaking) those solutions.
Async Closures: Already Here
The one 2026 feature you can already use: async closures landed in Rust 1.85 (February 2025). They're not waiting for 2026.
let fetch_data = async || {
client.get("https://api.example.com/data").await
};
That's it. That works now. The async Rust experience is converging toward sync Rust ergonomics β closures that capture, await that just works.
What's Coming Next
The 2026 roadmap also includes:
- Polonius β the next-gen borrow checker that's been in development for years, getting closer to stabilization
- C++ interop β making Rust play nicer with existing C++ codebases
- Extended async trait support β
async fnin traits,dyn async Trait
But the headline is clear: Rust 2026 is being shaped by systems programming constraints, not web service ergonomics. That's a good thing. The features that matter for the kernel matter for anyone pushing the language to its limits.
Field projections and in-place initialization are how Rust earns the right to run everywhere. The question isn't whether Rust belongs in the kernel β it's what else these features unlock.