[COMMITTED 43/43] gccrs: backend: Prevent error_mark_node from leaking into const context

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Tue Apr 14 23:19:04 GMT 2026


From: jayant chauhan <0001jayant@gmail.com>

Fixes Rust-GCC#3910

gcc/rust/ChangeLog:

	* backend/rust-compile-item.cc (CompileItem::visit): Do not insert
	const_expr into the context if it is an error_mark_node.
	* backend/rust-compile-implitem.cc (CompileTraitItem::visit): Likewise.

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3910.rs: New test.

Signed-off-by: jayant chauhan <0001jayant@gmail.com>
---
 gcc/rust/backend/rust-compile-implitem.cc |  8 ++++++--
 gcc/rust/backend/rust-compile-item.cc     |  7 +++++--
 gcc/testsuite/rust/compile/issue-3910.rs  | 14 ++++++++++++++
 3 files changed, 25 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-3910.rs

diff --git a/gcc/rust/backend/rust-compile-implitem.cc b/gcc/rust/backend/rust-compile-implitem.cc
index f4adaa2dd10..c94f439e1d6 100644
--- a/gcc/rust/backend/rust-compile-implitem.cc
+++ b/gcc/rust/backend/rust-compile-implitem.cc
@@ -44,8 +44,12 @@ CompileTraitItem::visit (HIR::TraitItemConst &constant)
 			     resolved_type, canonical_path, const_value_expr,
 			     constant.get_locus (),
 			     const_value_expr.get_locus ());
-  ctx->push_const (const_expr);
-  ctx->insert_const_decl (constant.get_mappings ().get_hirid (), const_expr);
+  if (const_expr != error_mark_node)
+    {
+      ctx->push_const (const_expr);
+      ctx->insert_const_decl (constant.get_mappings ().get_hirid (),
+			      const_expr);
+    }
 
   reference = const_expr;
 }
diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc
index 28694361b1b..f9b003cf535 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -129,8 +129,11 @@ CompileItem::visit (HIR::ConstantItem &constant)
 			     const_value_expr.get_locus ());
   ctx->pop_const_context ();
 
-  ctx->push_const (const_expr);
-  ctx->insert_const_decl (mappings.get_hirid (), const_expr);
+  if (const_expr != error_mark_node)
+    {
+      ctx->push_const (const_expr);
+      ctx->insert_const_decl (mappings.get_hirid (), const_expr);
+    }
   reference = const_expr;
 }
 
diff --git a/gcc/testsuite/rust/compile/issue-3910.rs b/gcc/testsuite/rust/compile/issue-3910.rs
new file mode 100644
index 00000000000..57022943e0f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3910.rs
@@ -0,0 +1,14 @@
+#![feature(no_core)]
+#![no_core]
+
+struct B<const M: u32> {}
+
+impl<const M: u32> B<M> {
+    const M: u32 = M;
+}
+
+struct C;
+
+impl<const M: u32> C { // { dg-error "unconstrained type parameter" }
+    const USE_M: u32 = M;
+}
\ No newline at end of file
-- 
2.50.1



More information about the Gcc-rust mailing list