https://gcc.gnu.org/g:01e17c255ea9ec1782d9bfea1e2d4ae2a06dc8d2
commit r17-5134-g01e17c255ea9ec1782d9bfea1e2d4ae2a06dc8d2 Author: Philip Herron <[email protected]> Date: Mon Sep 14 21:36:26 2026 +0100 gccrs: Remove unnessecary diagnostics on array capacity values Fixes Rust-GCC/gccrs#4153 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): always update const type * typecheck/rust-unify.cc (UnifyRules::expect_array): emit_error=false gcc/testsuite/ChangeLog: * rust/compile/issues/4168.rs: remove dup/bad diagnostic * rust/compile/issues/issue-4153.rs: New test. Signed-off-by: Philip Herron <[email protected]> Diff: --- gcc/rust/typecheck/rust-hir-type-check-type.cc | 5 +++-- gcc/rust/typecheck/rust-unify.cc | 5 ++++- gcc/testsuite/rust/compile/issues/4168.rs | 1 - gcc/testsuite/rust/compile/issues/issue-4153.rs | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc index 5fe75cf487b8..c60d419e5422 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc @@ -734,9 +734,10 @@ TypeCheckType::visit (HIR::ArrayType &type) const_type = new TyTy::ConstValueType (capacity_expr, expected_ty, size_id, size_id); - context->insert_type (type.get_size_expr ().get_mappings (), - const_type->as_base_type ()); } + + context->insert_type (type.get_size_expr ().get_mappings (), + const_type->as_base_type ()); } translated diff --git a/gcc/rust/typecheck/rust-unify.cc b/gcc/rust/typecheck/rust-unify.cc index c8dee621452d..3d5454741201 100644 --- a/gcc/rust/typecheck/rust-unify.cc +++ b/gcc/rust/typecheck/rust-unify.cc @@ -987,7 +987,10 @@ UnifyRules::expect_array (TyTy::ArrayType *ltype, TyTy::BaseType *rtype) auto capacity_type_unify = capacity_unify->as_const_type (); if (capacity_type_unify->const_kind () == TyTy::BaseConstType::ConstKind::Error) - return unify_error_type_node (); + { + emit_error = false; + return unify_error_type_node (); + } return new TyTy::ArrayType ( type.get_ref (), type.get_ty_ref (), type.get_ident ().locus, diff --git a/gcc/testsuite/rust/compile/issues/4168.rs b/gcc/testsuite/rust/compile/issues/4168.rs index ad0d0420fe1e..7d01ec9f2784 100644 --- a/gcc/testsuite/rust/compile/issues/4168.rs +++ b/gcc/testsuite/rust/compile/issues/4168.rs @@ -7,4 +7,3 @@ const fn add(x: usize, y: usize) -> i32 { } const ARR: [i32; add(1, 2)] = [5, 6, 1]; // { dg-error "mismatched types, expected .usize. but got .i32. .E0308." "" { target *-*-* } .-1 } -// { dg-error "mismatched types" "" { target *-*-* } .-2 } diff --git a/gcc/testsuite/rust/compile/issues/issue-4153.rs b/gcc/testsuite/rust/compile/issues/issue-4153.rs new file mode 100644 index 000000000000..e79e6c328e61 --- /dev/null +++ b/gcc/testsuite/rust/compile/issues/issue-4153.rs @@ -0,0 +1,15 @@ +#![feature(no_core, lang_items)] +#![no_core] + +#[lang = "sized"] +pub trait Sized {} + +fn is_123(x: [u32; N]) -> bool { // { dg-error "mismatched types, expected .usize. but got .fn \\(\\) -> \\(\\)." } + // { dg-error "capacity of array .* is not known at compile time" "" { target *-*-* } .-1 } + match x { + [1, 2] => true, + _ => false, + } +} + +fn N() {}
