# A deep dive into generic associated types ## Overview [Tracking issue](https://github.com/rust-lang/rust/issues/44265) [Initiative](https://rust-lang.github.io/generic-associated-types-initiative/) ### History of major milestones/PRs * On 2016-04-30, [RFC opened](https://github.com/rust-lang/rfcs/pull/1598) * On 2017-09-02, RFC merged and [tracking issue opened](https://github.com/rust-lang/rust/issues/44265) * On 2017-10-23, [Move Generics from MethodSig to TraitItem and ImplItem](https://github.com/rust-lang/rust/pull/44766) * On 2017-12-01, [Generic Associated Types Parsing & Name Resolution](https://github.com/rust-lang/rust/pull/45904) * On 2017-12-15, [https://github.com/rust-lang/rust/pull/46706](https://github.com/rust-lang/rust/pull/46706) * On 2018-04-23, [Feature gate where clauses on associated types](https://github.com/rust-lang/rust/pull/49368) * On 2018-05-10, [Extend tests for RFC1598 (GAT)](https://github.com/rust-lang/rust/pull/49423) * On 2018-05-24, [Finish implementing GATs (Chalk)](https://github.com/rust-lang/chalk/pull/134) * On 2019-12-21, [Make GATs less ICE-prone](https://github.com/rust-lang/rust/pull/67160) * On 2020-02-13, [fix lifetime shadowing check in GATs](https://github.com/rust-lang/rust/pull/68938) * On 2020-06-20, [Projection bound validation](https://github.com/rust-lang/rust/pull/72788) * On 2020-10-06, [Separate projection bounds and predicates](https://github.com/rust-lang/rust/pull/73905) * On 2021-02-05, [Generic associated types in trait paths](https://github.com/rust-lang/rust/pull/79554) * On 2021-02-06, [Trait objects do not work with generic associated types](https://github.com/rust-lang/rust/issues/81823) * On 2021-04-28, [Make traits with GATs not object safe](https://github.com/rust-lang/rust/pull/84622) * On 2021-05-11, [Improve diagnostics for GATs](https://github.com/rust-lang/rust/pull/82272) * On 2021-07-16, [Make GATs no longer an incomplete feature](https://github.com/rust-lang/rust/pull/84623) * On 2021-07-16, [Replace associated item bound vars with placeholders when projecting](https://github.com/rust-lang/rust/pull/86993) * On 2021-07-26, [GATs: Decide whether to have defaults for `where Self: 'a`](https://github.com/rust-lang/rust/issues/87479) * On 2021-08-25, [Normalize projections under binders](https://github.com/rust-lang/rust/pull/85499) * On 2021-08-03, [The push for GATs stabilization](https://blog.rust-lang.org/2021/08/03/GATs-stabilization-push.html) * On 2021-08-12, [Detect stricter constraints on gats where clauses in impls vs trait](https://github.com/rust-lang/rust/pull/88336) * On 2021-09-20, [Proposal: Change syntax of where clauses on type aliases](https://github.com/rust-lang/rust/issues/89122) * On 2021-11-06, [Implementation of GATs outlives lint](https://github.com/rust-lang/rust/pull/89970) * On 2021-12-29. [Parse and suggest moving where clauses after equals for type aliases](https://github.com/rust-lang/rust/pull/92118) * On 2022-01-15, [Ignore static lifetimes for GATs outlives lint](https://github.com/rust-lang/rust/pull/92865) * On 2022-02-08, [Don't constrain projection predicates with inference vars in GAT substs](https://github.com/rust-lang/rust/pull/92917) * On 2022-02-15, [Rework GAT where clause check](https://github.com/rust-lang/rust/pull/93820) * On 2022-02-19, [Only mark projection as ambiguous if GAT substs are constrained](https://github.com/rust-lang/rust/pull/93892) * On 2022-03-03, [Support GATs in Rustdoc](https://github.com/rust-lang/rust/pull/94009) * On 2022-03-06, [Change location of where clause on GATs](https://github.com/rust-lang/rust/pull/90076) ## Syntax - Generics on associated types - Where clauses position and rules - Lifetimes on GATs in bounds ## Well-formedness rules - [`check_gat_where_clauses`](https://github.com/rust-lang/rust/blob/661e8beec1fa5f3c58bf6e4362ae3c3fe0b4b1bd/compiler/rustc_typeck/src/check/wfcheck.rs#L276) - Source of the "outlives lint" ## Impl type checking - [`compare_type_predicate_entailment`](https://github.com/rust-lang/rust/blob/661e8beec1fa5f3c58bf6e4362ae3c3fe0b4b1bd/compiler/rustc_typeck/src/check/compare_method.rs#L1117) - Checks that we don't have extra bounds on the impl's associated type compared to the trait's - [`check_type_bounds`](https://github.com/rust-lang/rust/blob/661e8beec1fa5f3c58bf6e4362ae3c3fe0b4b1bd/compiler/rustc_typeck/src/check/compare_method.rs#L1233) - In an impl or default trait value, check that the type meets the defined bounds ## Normalization - [`assoc_ty_own_obligations`](https://github.com/rust-lang/rust/blob/661e8beec1fa5f3c58bf6e4362ae3c3fe0b4b1bd/compiler/rustc_trait_selection/src/traits/project.rs#L1982) - [Projecting under bound vars](https://github.com/rust-lang/rust/blob/661e8beec1fa5f3c58bf6e4362ae3c3fe0b4b1bd/compiler/rustc_trait_selection/src/traits/project.rs#L520) ## Current bugs [All open issues](https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AF-generic_associated_types) Some highlighted "categories" - [Higher-ranked lifetime obligations](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=4b39caa9d58bce5bb848f194c419c087) - End up with `for<'x> I: 'x` - [Associated type vs type alias changes early vs late bound](https://github.com/rust-lang/rust/issues/85533) - [Overflow when bounds reference themselves](https://github.com/rust-lang/rust/issues/87755) - ['static bound doesn't work](https://github.com/rust-lang/rust/issues/91395) ## Future features/directions ### Object-safe traits with GATs ### Universally-quantified types (`for<T> ...`) ### GATified Iterator?