On August 4, the Rust team did something Rust developers have been waiting for since 2018: they enabled Polonius Alpha on nightly. The smarter, flow-sensitive borrow checker — the one that knows the difference between a borrow that’s active and one that could theoretically still be active — is now testable by anyone running nightly-2026-08-06 or later. The team says there are no known blocking issues. Stabilization is coming in months.
This is worth paying attention to. The borrow checker is Rust’s most powerful feature and its most notorious learning wall. Polonius doesn’t remove the wall — it removes the parts of the wall that were never supposed to be there.
NLL Was Good. Polonius Is Better.
Non-Lexical Lifetimes, which became the default in Rust 1.63, was a major step forward. Before NLL, borrows lasted until the end of their lexical scope even if you stopped using them three lines in. NLL ended borrows where you actually stopped using them.
But NLL still had a blind spot: it reasoned about lifetimes at the level of scopes and regions, not individual execution paths. If a borrow could extend into a branch, NLL assumed it did — even when it provably didn’t.
Polonius fixes this by switching to a loan-based model. Instead of asking “how long does this lifetime last?”, it asks “which specific loans are active at this exact point in the control flow?” It’s flow-sensitive in the way NLL never was. The official announcement on the Rust Blog has the technical details straight from the team.
The Code That Now Compiles
The most illustrative example is NLL Problem Case #3: a conditional borrow where you return early in one branch or let the borrow lapse in another. The classic version is a get_or_insert pattern on a HashMap:
fn get_or_insert_default<'a>(
map: &'a mut HashMap<String, String>,
key: &str,
) -> &'a String {
match map.get_mut(key) {
Some(v) => return v, // borrow ends here — value returned
None => {}, // NLL thinks the borrow is still alive
}
// NLL error: cannot borrow `map` as mutable
// Polonius: no problem, the borrow ended in the Some arm
map.insert(key.to_string(), String::new());
map.get(key).unwrap()
}
NLL rejects this. It assumes the mutable borrow from map.get_mut(key) is still active when you reach the insert call, even though the Some arm returns immediately and the None arm does nothing. Polonius knows the borrow is dead in the None branch and accepts the code.
The second major pattern is lending iterator filter adapters. If you’ve tried to write a safe filter for a LendingIterator using GATs, you’ve hit GitHub issue #92985 — the self-reborrow inside the loop is incorrectly rejected by NLL. Polonius resolves it. Libraries that currently use unsafe workarounds to paper over these patterns — like polonius-the-crab on crates.io — become obsolete when Polonius stabilizes.
How to Try It Today
Polonius Alpha runs on any nightly build from August 6 onward. Switch your toolchain and it’s active by default:
rustup override set nightly
To explicitly control it:
# Force Polonius on
RUSTFLAGS="-Zpolonius=next" cargo build
# Force Polonius off (use old NLL)
RUSTFLAGS="-Zpolonius=off" cargo build
If you hit a case where something compiles under Polonius but shouldn’t, or something that should now compile but still fails, report it in the tracking issue on GitHub. The nightly period exists to surface exactly these edge cases before stabilization.
The Performance Trade-Off
Performance was the reason Polonius spent years as a research project rather than a shipping product. The original 2018 formulation was so slow on certain programs it was described internally as “a non-starter.” The 2025 work — particularly a lazy constraint graph rewrite — changed that calculus.
The team’s current position: Polonius Alpha adds 10–20% to compile times in some cases, and they’ve decided that’s acceptable. Rust team member Jack Huey was direct about it: “performance is generally acceptable for stabilization.” Translation: you will notice longer builds on large projects. The team decided the expressiveness gain is worth it.
What This Doesn’t Fix
Be clear-eyed about scope. Polonius Alpha is a superset of NLL — it accepts everything NLL accepts, plus the additional patterns above. It does not handle all borrow checker edge cases. Complex conditional reborrowing — the kind you hit traversing linked lists or building self-referential data structures — is a different research effort called “The Borrow Checker Within,” a separate project goal with no committed stabilization date.
No unsafe code becomes allowed. No safe code becomes unsafe. The memory safety guarantees are unchanged. Polonius just removes the false positives that made you wrestle the compiler on code you knew was correct.
The Stabilization Path
The 2026 project goals page lists the remaining work: validating performance on a broader range of codebases, building a formal model in a-mir-formality, and preparing a stabilization report. The nightly testing period is the last major step. Based on the official blog post, the team expects to land stabilization before the year is out.
If you write Rust professionally, start testing against your codebase now. Identify the patterns you’ve been working around with clones, restructuring, or unsafe. Check if Polonius cleans them up. Report what breaks. Eight years of groundwork is converging on a stable release — the next few months are when your feedback actually changes the outcome.













