Skip to content

Conversation

@philberty
Copy link
Member

@philberty philberty commented Nov 17, 2025

NOTE: Gat's are not finished this is just a starting point

This patch is the initial part in supporting generic associated types. In rust we have trait item types that get implemented for example:

  trait Foo<T> {
    type Bar
  }

  impl<T> Foo for T {
    type Bar = T
  }

The trait position uses a Ty::Placeholder which is just a thing that gets set for lazy evaluation to the impl type alias which is actually a Ty::Projection see:

0798add

For more info the projection type needs to hold onto generics in order to properly support generic types this GAT's support extends this all the way to the placeholder which still needs to be done.

Fixes #4276

gcc/rust/ChangeLog:

* ast/rust-ast.cc (TraitItemType::as_string): add generic params
* ast/rust-ast.h: remove old comment
* ast/rust-item.h: add generic params to associated type
* ast/rust-type.h: remove old comment
* hir/rust-ast-lower-implitem.cc (ASTLowerTraitItem::visit): hir lowering for gat's
* hir/tree/rust-hir-item.cc (TraitItemType::TraitItemType): gat's on TraitItemType
(TraitItemType::operator=): preserve generic params
* hir/tree/rust-hir-item.h: likewise
* hir/tree/rust-hir.cc (TraitItemType::as_string): likewise
* parse/rust-parse-impl.h (Parser::parse_trait_type): hit the < and parse params
* typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItemWithTrait::visit): typecheck
* typecheck/rust-tyty.cc (BaseType::has_substitutions_defined): dont destructure

gcc/testsuite/ChangeLog:

* rust/compile/gat1.rs: New test.
* rust/execute/torture/gat1.rs: New test.

*Please write a comment explaining your change. This is the message
that will be part of the merge commit.

This patch is the initial part in supporting generic associated types. In rust we have
trait item types that get implemented for example:

  trait Foo<T> {
    type Bar
  }

  impl<T> Foo for T {
    type Bar = T
  }

The trait position uses a Ty::Placeholder which is just a thing that gets set for
lazy evaluation to the impl type alias which is actually a Ty::Projection see:

  0798add

For more info the projection type needs to hold onto generics in order to properly
support generic types this GAT's support extends this all the way to the placeholder
which still needs to be done.

Fixes #4276

gcc/rust/ChangeLog:

	* ast/rust-ast.cc (TraitItemType::as_string): add generic params
	* ast/rust-ast.h: remove old comment
	* ast/rust-item.h: add generic params to associated type
	* ast/rust-type.h: remove old comment
	* hir/rust-ast-lower-implitem.cc (ASTLowerTraitItem::visit): hir lowering for gat's
	* hir/tree/rust-hir-item.cc (TraitItemType::TraitItemType): gat's on TraitItemType
	(TraitItemType::operator=): preserve generic params
	* hir/tree/rust-hir-item.h: likewise
	* hir/tree/rust-hir.cc (TraitItemType::as_string): likewise
	* parse/rust-parse-impl.h (Parser::parse_trait_type): hit the < and parse params
	* typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItemWithTrait::visit): typecheck
	* typecheck/rust-tyty.cc (BaseType::has_substitutions_defined): dont destructure

gcc/testsuite/ChangeLog:

	* rust/compile/gat1.rs: New test.
	* rust/execute/torture/gat1.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Copy link
Member

@CohenArthur CohenArthur left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@CohenArthur CohenArthur added this pull request to the merge queue Nov 19, 2025
Merged via the queue into master with commit f942905 Nov 19, 2025
12 checks passed
@github-project-automation github-project-automation bot moved this from Todo to Done in libcore 1.49 Nov 19, 2025
@dkm dkm deleted the phil/gat-parser branch November 19, 2025 14:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Cannot parse generic associated type

3 participants