https://gcc.gnu.org/g:6655c7d8b09b84ed863b1b63d5ecd4bc91d928a5
commit r17-4317-g6655c7d8b09b84ed863b1b63d5ecd4bc91d928a5 Author: Philip Herron <[email protected]> Date: Mon Aug 31 20:07:14 2026 +0100 gccrs: Fix missing unconstrained check to look at the full argument Fixes Rust-GCC/gccrs#4822 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-base.cc (walk_type_to_constrain): prototype (walk_types_to_constrain): make sure to walk the argument too gcc/testsuite/ChangeLog: * rust/compile/issue-4822.rs: New test. Signed-off-by: Philip Herron <[email protected]> Diff: --- gcc/rust/typecheck/rust-hir-type-check-base.cc | 5 ++++- gcc/testsuite/rust/compile/issue-4822.rs | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.cc b/gcc/rust/typecheck/rust-hir-type-check-base.cc index 97ff55400c3d..b53232a57e52 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-base.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-base.cc @@ -26,7 +26,6 @@ #include "rust-type-util.h" #include "rust-attribute-values.h" #include "rust-tyty.h" -#include "tree.h" namespace Rust { namespace Resolver { @@ -58,6 +57,9 @@ TypeCheckBase::ResolvePredicateFromBound ( is_qualified_type, is_super_trait); } +static void walk_type_to_constrain (std::set<HirId> &constrained_symbols, + TyTy::BaseType &r); + static void walk_types_to_constrain (std::set<HirId> &constrained_symbols, const TyTy::SubstitutionArgumentMappings &constraints) @@ -70,6 +72,7 @@ walk_types_to_constrain (std::set<HirId> &constrained_symbols, const auto p = arg->get_root (); constrained_symbols.insert (p->get_ref ()); constrained_symbols.insert (p->get_ty_ref ()); + walk_type_to_constrain (constrained_symbols, *arg); if (p->has_substitutions_defined ()) { diff --git a/gcc/testsuite/rust/compile/issue-4822.rs b/gcc/testsuite/rust/compile/issue-4822.rs new file mode 100644 index 000000000000..45641ad3c5dc --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4822.rs @@ -0,0 +1,11 @@ +#![feature(lang_items, no_core)] +#![no_core] + +#[lang = "sized"] +trait Sized {} + +trait PartialEq<Rhs> {} + +impl<A, B, const N: usize> PartialEq<[B; N]> for [A; N] {} + +fn main() {}
