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 &param)
 {
-  auto expr_vis = [this, &param] () { AST::DefaultASTVisitor::visit (param); };
+  auto param_ban_vis = [this, &param] () {
+    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);

Reply via email to