gccrs: Implement proper generic associated types
GCC's Rust frontend now supports generic associated types (GATs) using projection types.
This significant change in gccrs implements generic associated types (GATs) by utilizing projection types. This approach avoids mutating associated type placeholders and allows GATs to compose correctly through substitution and unification, fixing Rust-GCC#4293.
In Details
GCC's Rust frontend (gccrs) now correctly implements Rust's generic associated types (GATs). The implementation replaces the previous ad-hoc mutation of associated type placeholders with a robust system using normalized ProjectionTypes. This enables GATs to interact correctly with substitution, unification, and generic bounds, particularly in complex scenarios like nested projections or where Self is rebound. This addresses correctness issues and simplifies the type system's handling of GATs, impacting trait resolution and type checking.
- Generic Associated Types (GATs)
- A Rust feature allowing associated types within traits to themselves be generic, enabling more complex trait definitions and implementations. They are a powerful tool for abstracting over types and implementations.
- Projection Type
- In the context of Rust's type system, a projection type represents an associated type of a trait, potentially with substitutions for generic parameters. It signifies a type that needs to be resolved based on a specific trait implementation.
- Associated Type
- A placeholder for a type within a Rust trait definition that is to be specified by implementers of the trait. They allow traits to abstract over types in a structured way.
- Substitution
- The process of replacing generic type parameters with concrete types during type checking or compilation when instantiating a generic function, struct, or trait.
- Unification
- An algorithm used in type systems to determine if two types are compatible or equivalent, often by finding a most general type that satisfies a set of type constraints.