]> git.ipfire.org Git - thirdparty/gcc.git/commit
gccrs: Add support for initial generic associated types
authorPhilip Herron <herron.philip@googlemail.com>
Mon, 17 Nov 2025 21:14:44 +0000 (21:14 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 25 Nov 2025 22:00:51 +0000 (23:00 +0100)
commitaf42d91c9571bf4b95b8939b971244e9eba0828f
treed17897238452fb5f726b456dde041a578eb083bf
parentbfacb5f326751f980619834d09e6c87a480689f5
gccrs: Add support for initial generic associated types

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:

  0798add3d3c1bf4b20ecc1b4fa1047ba4ba19759

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 Rust-GCC#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>
13 files changed:
gcc/rust/ast/rust-ast.cc
gcc/rust/ast/rust-ast.h
gcc/rust/ast/rust-item.h
gcc/rust/ast/rust-type.h
gcc/rust/hir/rust-ast-lower-implitem.cc
gcc/rust/hir/tree/rust-hir-item.cc
gcc/rust/hir/tree/rust-hir-item.h
gcc/rust/hir/tree/rust-hir.cc
gcc/rust/parse/rust-parse-impl.h
gcc/rust/typecheck/rust-hir-type-check-implitem.cc
gcc/rust/typecheck/rust-tyty.cc
gcc/testsuite/rust/compile/gat1.rs [new file with mode: 0644]
gcc/testsuite/rust/execute/torture/gat1.rs [new file with mode: 0644]