The 2025H2 Project Goal period has now concluded. Over these months, the Rust Project pursued 41 Project Goals, 13 of which were designated as Flagship Goals. This post contains curated updates on our progress since the last post and the final status for each of the goals (many of which continue as part of the 2026 period). Full details for any particular goal are available in its tracking issue.
Thanks to everyone who contributed! <3
Table of contents
- Flagship: Beyond the
& - Flagship: Flexible, fast(er) compilation
- Flagship: Higher-level Rust
- Flagship: Unblocking dormant traits
- Other goal updates
- Add a team charter for rustdoc team
- Borrow checking in a-mir-formality
- C++/Rust Interop Problem Space Mapping
- Comprehensive niche checks for Rust
- Const Generics
- Continue resolving
cargo-semver-checksblockers for merging into cargo - Develop the capabilities to keep the FLS up to date
- Emit Retags in Codegen
- Expand the Rust Reference to specify more aspects of the Rust language
- Finish the libtest json output experiment
- Finish the std::offload module
- Getting Rust for Linux into stable Rust: compiler features
- Getting Rust for Linux into stable Rust: language features
- Implement Open API Namespace Support
- MIR move elimination
- Prototype a new set of Cargo "plumbing" commands
- Prototype Cargo build analysis
- reflection and comptime
- Rework Cargo Build Dir Layout
- Run more tests for GCC backend in the Rust's CI
- Rust Stabilization of MemorySanitizer and ThreadSanitizer Support
- Rust Vision Document
- rustc-perf improvements
- Stabilize public/private dependencies
- Stabilize rustdoc
doc_cfgfeature - SVE and SME on AArch64
- Type System Documentation
- Unsafe Fields
Flagship: Beyond the &
Continue Experimentation with Pin Ergonomics
- People involved: Frank King
- Champions: compiler (Oliver Scherer), lang (TC)
- Status: Continued
-
Frank King — comment from 2026-02-26
(Just come back from the Spring Festival)
- (locally, no PR yet): design and implement the borrow checking algorithms of
&pin - Reviewed Add
Drop::pin_dropfor pinned drops, to update the submodulebook - Reviewed Implement coercions between
&pin (mut|const) Tand&(mut) TwhenT: Unpin, to do some refactors according to the reviewed messages.
- (locally, no PR yet): design and implement the borrow checking algorithms of
-
Frank King — comment from 2026-03-16
- Merged Implement coercions between
&pin (mut|const) Tand&(mut) TwhenT: Unpin. - Opened draft PR Implement borrowck for
&pin mut|const $place. The implementation needs to be refined and self-reviewed before the community reviews.
- Merged Implement coercions between
-
Frank King — comment from 2026-04-16
Self-reviewed Implement borrowck for
&pin mut|const $place. Found that the current approach of handling pinned borrows may be incorrect, as it failed to distinguish a pinned borrow from a coercion of a normal-to-pinned reference. The latter doesn't prevent aT: Unpintype from being moved, but the former does, which breaks the pin coercion test.
Design a language feature to solve Field Projections
- People involved: Benno Lossin
- Champions: lang (Tyler Mandry)
- Status: Continued
-
Benno Lossin — comment from 2026-01-01
- At the beginning of December, we set out to answer five important questions regarding the virtual places approach. We discussed four questions and arrived at answers for three.
- The first question we looked at was question 3 Canonical Projections.
- Next we looked at question 4 Non-Indirected Containers.
- As the final question we answered, we looked at question 1 Field-by-Field Projections vs One-Shot Projections.
- At the moment, we are investigating question 2 and I wrote a blog post with a potential solution that still needs feedback.
- We started a Wiki Project to consolidate our knowledge in one place.
- We implemented an algorithm to determine the type of a place expression.
- Our plan is to continue this project goal in the next goal period.
- At the beginning of December, we set out to answer five important questions regarding the virtual places approach. We discussed four questions and arrived at answers for three.
-
Benno Lossin — comment from 2026-01-25
Earlier this month, Nadrieril Ding Xiang Fei and I held a meeting on autoref and method resolution in a world with field projections. This meeting resulted in a new page for the wiki on autoref.
-
Benno Lossin — comment from 2026-02-28
The first pull request of the lang experiment has just been merged: rust-lang/rust#152730
This PR enables the use of the
field_of!macro to obtain a unique type for each field of a struct, enum variant, tuple, or union. We call these types field representing types (FRTs). When the base type is a struct that is notrepr(packed), only containsSizedfields, this type automatically implements theFieldtrait that exposes some information about the field to the type system. The offset in bytes from the start of the struct, the type of the field and the type of the base type.The feature is still incomplete and highly experimental. We also want to tackle the limitations in future PRs. For the moment this is enough to give us the ability to experiment with library versions of field projections and write functions that are generic over the fields of structs. For example one can write code like this:
#![feature(field_projections)] use std::field::{Field, field_of}; use std::ptr; fn project_ref<'a, T, F: Field<Base = T>>(r: &'a T) -> &'a F::Type { // SAFETY: the `Field` trait guarantees that this is sound. unsafe { &*ptr::from_ref(r).byte_add(F::OFFSET).cast() } } struct Struct { field: i32, other: u32, } fn main() { let s = Struct { field: 42, other: 24 }; let r = &s; let field = project_ref::<_, field_of!(Struct, field)>(r); let other = project_ref::<_, field_of!(Struct, other)>(r); println!("field: {field}"); // prints 42 println!("other: {other}"); // prints 24 }A very important feature of the types returned by
field_of!is that you can implement traits for them if you own the base type. This allows anointing fields with information by extending theFieldtrait. For example, this allows encoding the property of being a structurally pinned field:use std::pin::Pin; unsafe trait PinnableField: Field { type StructuralRefMut<'a> where Self::Type: 'a, Self::Base: 'a; fn project_mut<'a>(base: Pin<&'a mut Self::Base>) -> Self::StructuralRefMut<'a> where Self::Type: 'a, Self::Base: 'a; } fn project_pinned<'a, T, F>(r: Pin<&'a mut T>) -> <F as PinnableField>::StructuralRefMut<'a> where F: PinnableField<Base = T>, { F::project_mut(r) }We can then implement this extra trait for all of the fields of our struct (and automate that with a proc-macro):
unsafe impl PinnableField for field_of!(Struct, field) { type StructuralRefMut<'a> = &'a mut i32; fn project_mut<'a>(base: Pin<&'a mut Self::Base>) -> Self::StructuralRefMut<'a> where Self::Type: 'a, Self::Base: 'a, { let base = unsafe { Pin::into_inner_unchecked(base) }; &mut base.field } } unsafe impl PinnableField for field_of!(Struct, other) { type StructuralRefMut<'a> = Pin<&'a mut u32>; // u32 is `Unpin`, so this isn't doing anything special, but it highlights the pattern. fn project_mut<'a>(base: Pin<&'a mut Self::Base>) -> Self::StructuralRefMut<'a> where Self::Type: 'a, Self::Base: 'a, { let base = unsafe { Pin::into_inner_unchecked(base) }; unsafe { Pin::new_unchecked(&mut base.other) } } }Now you can safely obtain a pinned mutable reference to
otherand a normal mutable reference tofieldby calling theproject_pinnedfunction and supplying the correct FRT. -
Benno Lossin — comment from 2026-03-20
Plan for 2026
We have an updated plan for this goal in 2026 consisting of three major steps:
a-mir-formality,- Implementation,
- Experimentation.
Some of their subtasks depend on other subtasks for other steps. You can find the details in the updated tracking issue. Here is a short rundown of each:
a-mir-formality: we want to create a formal model of the borrow checker changes we're proposing to ensure correctness. We also want to create a document explaining our model in a more human-friendly language. To really get started with this, we're blocked on the new expression based syntax in development by Niko.Implementation: at the same time, we can start implementing more parts in the compiler. We will continue to improve FRTs, while keeping in mind that we might remove them if they end up being unnecessary. They still pose for a useful feature, but they might be orthogonal to field projections. We plan to make small and incremental changes, starting with library additions. We also want to begin exploring potential desugarings, for which we will add some manual and low level macros. When we have that figured out, we can fast-track syntax changes. When we have a sufficiently mature formal model of the borrow checker integration, we will port it to the compiler. After further evaluation, we can think about removing the
incomplete_featureflag.Experimentation: after each compiler or standard library change, we look to several projects to stress-test our ideas in real code. I will take care of experimentation in the Linux kernel, while Tyler Mandry will be taking a look at testing field projections with
crubit. Josh Triplett also has expressed eagerness of introducing them in the standard library; I will coordinate with him and the rest of t-libs-api to experiment there. -
Benno Lossin — comment from 2026-04-02
Yesterday, we held a t-lang design meeting on our current approach. Nadrieril and I authored a design document with the feedback of Tyler Mandry, Ding Xiang Fei, Alice Ryhl, and Gary Guo. In this document, we provided the motivation for this feature, what the look and feel of a solution fitting into the existing features of Rust is, and a comprehensive + compact introduction to our current approach based on virtual places.
The general reception was extremely positive. To give some concrete quotes from the meeting:
- Josh:
I adore this! I love how orthogonal it is, and how impactful and universal it is. I anticipate this becoming a beloved, pervasive feature of Rust.
Places and projection seem important enough to me that they're worth giving one of our precious remaining ASCII sigils to, and
@is nicely evocative of a place (something is at a place). So to the extent the final syntax benefits from a sigil, :+1: for giving this@. (See some feedback below on the details, though.) - TC:
Love it. High concept. As I said in the last meeting:
I particularly like language features that reduce the need for library surface area, and this is one of those.
There are, of course, many details to resolve and understand further, e.g., with respect to migration issues, interaction with
const,async, and other effect-like things, etc. I'm looking forward to seeing the formalization work. - tmandry:
What I love about this direction is how effectively it builds on what Rust already has. I love to see designs that reinforce our existing concepts while pushing them in directions that make them more expressive.
- Jack:
Whoo boy. This is great. There's so much here that I'm not exactly sure where to begin and what to comment on. I think this is the type of thing that we will only really be able to figure out the nitty gritty details and ergonomics only after some amount of experimentation.
There are a few takeaways from this meeting:
- Mark raised the concern that t-libs should be more involved in reviewing the experimental traits that we intend to add. Ensuring that we don't accidentally stabilize or expose some behavior, have sufficient documentation on our experimental traits, and that t-libs is in the loop of this feature in general.
- Mark offered to review PRs and I will be tagging him in those.
- Jack raised the concern that increasing the cognitive load for the 95% use-case should be avoided. Making the right choice between
@and&might be challenging for users.- We discussed this point more in the meeting and concluded with that we need to do some experimentation, possibly utilizing the user research team. We will of course keep this in mind and revisit it later when we have a partially working implementation.
- TC requested that we publish our fine-grained design axioms, essentially the list of things we go through when considering a modification of our proposal.
- I will write an update on this issue explaining exactly those.
Aside from the concerns and directly actionable items, the meeting also covered design questions/comments that we want to take a look at in the coming weeks/months:
- Can we support reads/writes of different types?
- Can we support re-assembly of wrapper types, so going from
Cell<[T]>to[Cell<T>]? - The
PlaceDiscriminanttrait needs to be carefully designed - How do we handle naming conflicts & ensure SemVer evolution of library types implementing our traits?
- Can we support projecting through
Option, so e.g.&Option<Struct>toOption<&Field>? - Can we support a pointer that carries alignment information & which is updated on projections?
- What compatibility with effects do we need or want to support?
- What doors on future ergonomic improvements of pointers are we closing by having field projections?
Thanks to everyone who participated in the meeting!
- Josh:
Reborrow traits
- People involved: Aapo Alasuutari
- Champions: compiler (Oliver Scherer), lang (Tyler Mandry)
- Status: Continued
-
Aapo Alasuutari — comment from 2026-02-28
PR open to get the first working version of the
ReborrowandCoerceSharedtraits merged.Blockers
Currently "blocked" on PR review, and of course my (and Ding's) work to fix all review issues.
The review has brought up an opportunity to replace
Rvalue::Ref/ExprKind::Refwith a more generalised variant that could encompass both references and user-defined references. This would be powerful, but it would be a very big and scary change. If this turns out to be a blocking issue for reviewers, then this will block the goal for the foreseeable future as the PR then starts on a massive refactoring.Help wanted
The PR currently does not include derive traits, but we'd really want them. Instead of these:
impl<'a> Reborrow for CustomMarker<'a> {} impl<'a> CoerceShared<CustomMarkerRef<'a>> for CustomMarker<a'> {} impl<'a, T> Reborrow for CustomMut<'a, T> {} impl<'a, T> CoerceShared<CustomRef<'a, T>> for CustomMut<'a, T> {}we'd prefer to have something like this:
#[derive(Reborrow, CoerceShared(CustomMarkerRef))] struct CustomMarker<'a> { ... } #[derive(Reborrow, CoerceShared(CustomRef))] struct CustomMut<'a, T> { ... }If anyone feels like picking up this thread, that'd be awesome: the derive macros do not need to really perform any validity checking, as the trait itself will do that.
If the PR merges soon, then public testing and exploration of the traits will be the next big thing. Likely concurrently with that the massive refactoring to generalise
Rvalue::Ref/ExprKind::Ref.
Flagship: Flexible, fast(er) compilation
build-std
- People involved: David Wood, Adam Gemmell
- Champions: cargo (Eric Huss), compiler (David Wood), libs (Amanieu d'Antras)
- Status: Continued
-
David Wood — comment from 2026-01-15
rust-lang/rfcs#3873 has been merged and an FCP has been started on rust-lang/rfcs#3874 and rust-lang/rfcs#3875 - those both have some feedback for me to respond to that I'll get to as soon as I can.
-
David Wood — comment from 2026-02-17
No major updates this cycle - we're still working through feedback on rust-lang/rfcs#3874 and rust-lang/rfcs#3875 and prototyping the implementation to be prepared.
-
David Wood — comment from 2026-03-17
Update this cycle is the same as last time - rust-lang/rfcs#3874 and rust-lang/rfcs#3875 are progressing, with feedback being addressed and checkboxes checked, and we're still working out what the implementation would look like.
-
David Wood — comment from 2026-04-14
rust-lang/rfcs#3874 has finished FCP and is due to be merged any day now. I'm working on resolving the remaining open comments on rust-lang/rfcs#3875 and then intend to nudge the reviewers to have a look and check their boxes or leave concerns.
Adam Gemmell has opened rust-lang/cargo#16675 with an early sketch of some of the core changes that build-std would require and is working with the Cargo team to address feedback and work out how to proceed with the implementation.
Production-ready cranelift backend
- People involved: Folkert de Vries, bjorn3, Trifecta Tech Foundation
- Champions: compiler (bjorn3)
- Status: Not completed (lack of funding)
Promoting Parallel Front End
- People involved: Sparrow Li
- Status: Continued
Relink don't Rebuild
- People involved: Jane Lusby, @dropbear32, @osiewicz
- Champions: cargo (Weihang Lo), compiler (Oliver Scherer)
- Status: Not completed (note)
Flagship: Higher-level Rust
Ergonomic ref-counting: RFC decision and preview
- People involved: Niko Matsakis, Santiago Pastorino
- Champions: compiler (Santiago Pastorino), lang (Niko Matsakis)
- Status: Continued
Stabilize cargo-script
- People involved: Ed Page
- Champions: cargo (Ed Page), lang (Josh Triplett), lang-docs (Josh Triplett)
- Status: Continued
-
Ed Page — comment from 2026-01-14
#146377 has been decided and merged.
Blockers
- T-lang discussing CR / text direction feedback: comment
- T-rustdoc deciding on and implementing how they want frontmatter handled in doctests
-
Ed Page — comment from 2026-02-13
- FCP has ended on frontmatter support, just awaiting merge
- Cargo script has entered FCP
Blockers
- Potential issues around edition, see Cargo script edition policy (lang/edition aspects).
-
Ed Page — comment from 2026-03-16
Cargo's FCP has ended.
Blockers
Flagship: Unblocking dormant traits
Evolving trait hierarchies
- People involved: Taylor Cramer and others
- Champions: lang (Taylor Cramer), types (Oliver Scherer)
- Status: Superseded by the Implement Supertrait
auto impland Arbitrary Self Types 2026 goals
In-place initialization
- People involved: Alice Ryhl, Benno Lossin, Michael Goulet, Taylor Cramer, Josh Triplett, Gary Guo, Yoshua Wuyts
- Champions: lang (Taylor Cramer)
- Status: Continued
-
Alice Ryhl — comment from 2026-01-31
A proposal to continue this goal in the next goal period was merged.
Next-generation trait solver
1 detailed update available.-
lcnr — comment from 2026-01-19
There hasn't been too much progress over the last few weeks and I've been mostly taking a Christmas break. Nicholas Nethercote has been looking into the performance of the new trait solver, cleaning up canonicalization and slightly improving its performance: PR 1 and PR 2.
Shoyu Vanilla looked into ICE from mir validation on unsizing in opendal and uncovered the underlying bug there. While this issue also affects the old solver and the proper fix for it requires where-bounds on binders, we can work around this bug in the trait solver for now and intend to do so.
We've started another crater run with all our recent changes and adwin has started to triage it, uncovering one new issue up until now. Intend to continue going through that over the next few weeks.
There's also a lot in-progress work going on. I am collaborating with Niko Matsakis to specify and later RFC the cycle semantics of Rust. León Orell Valerian Liehr is working on a replacement for the rustdoc's auto trait impl synthesis. tiif is working on a fix a MIR borrowck unsoundness. Shoyu Vanilla and I are improving the way we propagate inference constraints from the expected return type to function arguments, fixing this issue.
Stabilizable Polonius support on nightly
- People involved: Rémy Rakic, Amanda Stjerna, Niko Matsakis
- Champions: types (Jack Huey)
- Status: Continued
-
Rémy Rakic — comment from 2026-01-30
This month's update:
- tiif is making progress on normalizing opaques while computing implied bounds
- we discussed how to investigate and fix the remaining correctness issues in Tage's work, to be able to evaluate it more accurately: in particular around variance and bidirectional edges, and without the reliance on NLL (having computed region values / errors)
- we've tried to see if it'd be possible to remove the cfg region elements
- Amanda is still working on her two papers, one about the current borrow checker and one about the work on Polonius. Her major PR for the restructuring of placeholder handling during region inference is stalled due to a conflict with further trait solver developments and may have to be abandoned. Work with the larger types team is ongoing and smaller patches/refactorings/improvements are being landed in the meantime.
- #149639 has now landed, and #150551 is still in review
- I've also fixed more small inefficiencies (computing boring/relevant locals on-demand in diagnostics, removed conversions between locations and points, etc) building on top of the previous PRs (so they need to be reviewed first)
- I've looked at crates.io again with the alpha, to find functions that are slower than with NLLs. AFAICT the worst case there is 60% for a 5KLOC function with 42K loans, 255K statements, and 125K outlives constraints. I'll see what we can do with this. Small composable functions is still good advice.
- there seem to be optimization opportunities to 1. limit propagation to the smaller number of blocks that could be affected by bidirectional edges, 2. for unifying invariant lifetimes of live locals that are assigned at most once (à la use-def chains), 3. for invalidations that are just the activation of a reservation
- we discussed possible plans to gather actual statistics, using the infrastructure that was created for the Metrics project
- we're also preparing the new project goal for this year, where we'll want to stabilize the alpha 🤞
-
Rémy Rakic — comment from 2026-02-28
We had a bit less time this month, the update will be shorter, but still meaningful I hope:
- #150551 has landed, and it feels stabilizable. To me, this part of the goal is achieved.
- still, "stabilizable" is not stable, and there is more work to do. We plan to stabilize this year, and the project goal proposal for 2026 tracks how.
- tiif is still deep in #152051, and
a-mir-formalitywork with Niko and I. - Amanda has opened a few cleanup PRs (#152438, and #152579), and #151863 has landed already. She also has started looking into Tage's old PR to see if we can fix it, benchmark it more accurately, and see the cool parts there that we could be using.
- Jack is possibly going to have some time to work with us this year! His help will be very welcome, especially as I will have less time available myself.
- we'll be tracking the opaque type region liveness soundness issue in #153215, and I've added a couple tests, in case tiif's PR or anything that impacts them lands.
- some of the tiny cleanups I mentioned last time have also landed in #152587.
Other goal updates
Add a team charter for rustdoc team
- People involved: Guillaume Gomez
- Champions: rustdoc (Guillaume Gomez)
- Status: Completed
Borrow checking in a-mir-formality
- People involved: Niko Matsakis, tiif
- Champions: types (Niko Matsakis)
- Status: Continued
C++/Rust Interop Problem Space Mapping
- People involved: Joel Marcey
- Champions: compiler (Oliver Scherer), lang (Tyler Mandry), libs (David Tolnay)
- Status: Continued
-
Joel Marcey — comment from 2026-01-20
The Rust Foundatio
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.