https://gcc.gnu.org/g:09e7ac3a6ed62509b292516ef5256633a1144ee4
commit r17-3075-g09e7ac3a6ed62509b292516ef5256633a1144ee4 Author: Owen Avery <[email protected]> Date: Sat Jul 4 13:27:47 2026 -0400 gccrs: Fix type param forward declare check Type param bounds are allowed to use forward declared generic parameters. gcc/rust/ChangeLog: * resolve/rust-default-resolver.cc (DefaultResolver::visit (TypeParam)): Visit bounds outside of ForwardTypeParamBan rib. gcc/testsuite/ChangeLog: * rust/compile/generics15.rs: New test. Signed-off-by: Owen Avery <[email protected]> Diff: --- gcc/rust/resolve/rust-default-resolver.cc | 12 ++++++++++-- gcc/testsuite/rust/compile/generics15.rs | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index 10f506bb2364..ba65308688f4 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -433,9 +433,17 @@ DefaultResolver::visit (AST::StaticItem &item) void DefaultResolver::visit (AST::TypeParam ¶m) { - auto expr_vis = [this, ¶m] () { AST::DefaultASTVisitor::visit (param); }; + auto param_ban_vis = [this, ¶m] () { + visit_outer_attrs (param); + if (param.has_type ()) + visit (param.get_type ()); + }; + + ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), + param_ban_vis); - ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis); + for (auto &bound : param.get_type_param_bounds ()) + visit (bound); } void diff --git a/gcc/testsuite/rust/compile/generics15.rs b/gcc/testsuite/rust/compile/generics15.rs new file mode 100644 index 000000000000..bb50be4e88fb --- /dev/null +++ b/gcc/testsuite/rust/compile/generics15.rs @@ -0,0 +1,9 @@ +#![feature(no_core, lang_items)] +#![no_core] + +#[lang = "sized"] +pub trait Sized {} + +pub trait A<T> {} + +pub struct B<T: A<T>> (T);
