[gccrs COMMIT] rust: avoid ICE on attributed struct base parsing

gerris.rs@gmail.com gerris.rs@gmail.com
Sun Jun 28 22:28:26 GMT 2026


From: hriztam <hritamstark05@gmail.com>

gcc/rust/ChangeLog:

	* parse/rust-parse-error.h (StructExprField): Add
	STRUCT_BASE_ATTRIBUTES.
	* parse/rust-parse-impl-expr.hxx
	(Parser<ManagedTokenSource>::parse_struct_expr_field):
	Reject attributes before struct-base `..`.
	(Parser<ManagedTokenSource>::parse_struct_expr_struct_partial):
	Handle struct-base parse results without dereferencing an errored
	expected.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Hritam Shrivastava <hritamstark05@gmail.com>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: https://github.com/Rust-GCC/gccrs/commit/0144bafd9a9da4c220cc38c5f87b8a25d4c2c12d

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4514

 gcc/rust/parse/rust-parse-error.h        |  1 +
 gcc/rust/parse/rust-parse-impl-expr.hxx  | 20 ++++++++++++++++++--
 gcc/testsuite/rust/compile/issue-4476.rs | 10 ++++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-4476.rs

diff --git a/gcc/rust/parse/rust-parse-error.h b/gcc/rust/parse/rust-parse-error.h
index 46ac46245..a4eb34c12 100644
--- a/gcc/rust/parse/rust-parse-error.h
+++ b/gcc/rust/parse/rust-parse-error.h
@@ -358,6 +358,7 @@ enum class StructExprField
 {
   MALFORMED,
   CHILD_ERROR,
+  STRUCT_BASE_ATTRIBUTES,
   // Not a hard error
   STRUCT_BASE,
 };
diff --git a/gcc/rust/parse/rust-parse-impl-expr.hxx b/gcc/rust/parse/rust-parse-impl-expr.hxx
index 887991541..aaffa3dcb 100644
--- a/gcc/rust/parse/rust-parse-impl-expr.hxx
+++ b/gcc/rust/parse/rust-parse-impl-expr.hxx
@@ -1752,6 +1752,16 @@ Parser<ManagedTokenSource>::parse_struct_expr_field ()
     case DOT_DOT:
       /* this is a struct base and can't be parsed here, so just return
        * nothing without erroring */
+      if (!outer_attrs.empty ())
+	{
+	  add_error (
+	    Error (t->get_locus (),
+		   "attributes are not allowed before %<..%> in a struct "
+		   "expression"));
+
+	  return tl::unexpected<Parse::Error::StructExprField> (
+	    Parse::Error::StructExprField::STRUCT_BASE_ATTRIBUTES);
+	}
 
       return tl::unexpected<Parse::Error::StructExprField> (
 	Parse::Error::StructExprField::STRUCT_BASE);
@@ -4068,9 +4078,15 @@ Parser<ManagedTokenSource>::parse_struct_expr_struct_partial (
 	while (t->get_id () != RIGHT_CURLY && t->get_id () != DOT_DOT)
 	  {
 	    auto field = parse_struct_expr_field ();
-	    if (!field
-		&& field.error () != Parse::Error::StructExprField::STRUCT_BASE)
+	    if (!field)
 	      {
+		if (field.error () == Parse::Error::StructExprField::STRUCT_BASE)
+		  break;
+		if (field.error ()
+		    == Parse::Error::StructExprField::STRUCT_BASE_ATTRIBUTES)
+		  return tl::unexpected<Parse::Error::Expr> (
+		    Parse::Error::Expr::CHILD_ERROR);
+
 		Error error (t->get_locus (),
 			     "failed to parse struct (or enum) expr field");
 		add_error (std::move (error));
diff --git a/gcc/testsuite/rust/compile/issue-4476.rs b/gcc/testsuite/rust/compile/issue-4476.rs
new file mode 100644
index 000000000..2427a67eb
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4476.rs
@@ -0,0 +1,10 @@
+#![feature(no_core)]
+#![no_core]
+
+struct Foo {}
+struct S {}
+
+fn main() {
+    Foo { #[cfg(feature = -1)] .. } = S {};
+    // { dg-error "attributes are not allowed before .* in a struct expression" "" { target *-*-* } .-1 }
+}

base-commit: 2c7b222b96cb3dc63d104a16b65065fe21834829
-- 
2.54.0



More information about the Gcc-rust mailing list