From 94b28b34732f39a64b5b8cdc4a03e456362893d8 Mon Sep 17 00:00:00 2001 From: "lenny.chiadmi-delage" Date: Wed, 15 Oct 2025 15:07:05 +0000 Subject: [PATCH 1/3] gccrs: fix segfault in clone_pattern w macro Check if parser throw an error to avoid cloning nullptr Fixes #4140 gcc/rust/ChangeLog: * expand/rust-macro-expand.cc (transcribe_expression): Check if parser didn't fail. (transcribe_type): Likewise. (transcribe_pattern): Likewise. Signed-off-by: lenny.chiadmi-delage --- gcc/rust/expand/rust-macro-expand.cc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc index 52f8e2b10e3..b47e43afd76 100644 --- a/gcc/rust/expand/rust-macro-expand.cc +++ b/gcc/rust/expand/rust-macro-expand.cc @@ -962,12 +962,10 @@ transcribe_expression (Parser &parser) auto attrs = parser.parse_outer_attributes (); auto expr = parser.parse_expr (std::move (attrs)); - if (expr == nullptr) - { - for (auto error : parser.get_errors ()) - error.emit (); - return AST::Fragment::create_error (); - } + for (auto error : parser.get_errors ()) + error.emit (); + if (!expr) + return AST::Fragment::create_error (); // FIXME: make this an error for some edititons if (parser.peek_current_token ()->get_id () == SEMICOLON) @@ -997,6 +995,8 @@ transcribe_type (Parser &parser) auto type = parser.parse_type (true); for (auto err : parser.get_errors ()) err.emit (); + if (!type) + return AST::Fragment::create_error (); auto end = lexer.get_offs (); @@ -1018,6 +1018,9 @@ transcribe_pattern (Parser &parser) for (auto err : parser.get_errors ()) err.emit (); + if (!pattern) + return AST::Fragment::create_error (); + auto end = lexer.get_offs (); return AST::Fragment ({std::move (pattern)}, From 998c6550d260f9c504f60cf47f6bed31aba5d4b4 Mon Sep 17 00:00:00 2001 From: "lenny.chiadmi-delage" Date: Mon, 10 Nov 2025 16:00:29 +0000 Subject: [PATCH 2/3] gccrs: adds tests from issue 4140 Adds tests for testsuite. Fixes #4140 gcc/testsuite/ChangeLog: * rust/compile/issue-4140-1.rs: New test. * rust/compile/issue-4140-2.rs: Likewise. Signed-off-by: lenny.chiadmi-delage --- gcc/testsuite/rust/compile/issue-4140-1.rs | 18 ++++++++++++++++++ gcc/testsuite/rust/compile/issue-4140-2.rs | 11 +++++++++++ 2 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/rust/compile/issue-4140-1.rs create mode 100644 gcc/testsuite/rust/compile/issue-4140-2.rs diff --git a/gcc/testsuite/rust/compile/issue-4140-1.rs b/gcc/testsuite/rust/compile/issue-4140-1.rs new file mode 100644 index 00000000000..48aa98bc318 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4140-1.rs @@ -0,0 +1,18 @@ +pub enum TypeCtor { + Slice, + Array, +} +pub struct B(T); + +macro_rules! ty_app { + ($_a:pat) => { + ApplicationTy($ctor) // { dg-error "unexpected token '$' in typle struct items" "4140" { target *-*-* } . } + // { dg-error "failed to parse typle struct items" "4140" { target *-*-*} .-1 } + }; +} + +pub fn foo(ty: ApplicationTy) { // { dg-error "could not resolve type path 'ApplicationTy'" "4140" { target *-*-* } .-1 } + match ty { + ty_app!(bean::Array) => {} + } +} diff --git a/gcc/testsuite/rust/compile/issue-4140-2.rs b/gcc/testsuite/rust/compile/issue-4140-2.rs new file mode 100644 index 00000000000..507cf2aba38 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4140-2.rs @@ -0,0 +1,11 @@ +macro_rules! ty_app { + ($_a:pat) => { + ($ctor) // { dg-error "unrecognised token '$' in grouped or tuple pattern after first pattern" "4140" { target *-*-* } . } + }; +} + +pub fn foo() { + match ty { // { dg-error "Cannot find path 'ty' in this scope" "4140" { target *-*-* } .-1 } + ty_app!(bean::Array) => {} + } +} From a8f81d3ec51132474ecacb63ea00dc548ef241fd Mon Sep 17 00:00:00 2001 From: "lenny.chiadmi-delage" Date: Wed, 12 Nov 2025 10:10:54 +0000 Subject: [PATCH 3/3] gccrs: fixes previously added tests Fixes previously added tests. Fixes #4140 gcc/testsuite/ChangeLog: * rust/compile/issue-4140-1.rs: Fixes test. * rust/compile/issue-4140-2.rs: Likewise. Signed-off-by: lenny.chiadmi-delage --- gcc/testsuite/rust/compile/issue-4140-1.rs | 6 +++--- gcc/testsuite/rust/compile/issue-4140-2.rs | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/rust/compile/issue-4140-1.rs b/gcc/testsuite/rust/compile/issue-4140-1.rs index 48aa98bc318..8b68b3e2d8b 100644 --- a/gcc/testsuite/rust/compile/issue-4140-1.rs +++ b/gcc/testsuite/rust/compile/issue-4140-1.rs @@ -6,12 +6,12 @@ pub struct B(T); macro_rules! ty_app { ($_a:pat) => { - ApplicationTy($ctor) // { dg-error "unexpected token '$' in typle struct items" "4140" { target *-*-* } . } - // { dg-error "failed to parse typle struct items" "4140" { target *-*-*} .-1 } + ApplicationTy($ctor) // { dg-error "unexpected token" } + // { dg-error "failed to parse tuple struct items" "" { target *-*-* } .-1 } }; } -pub fn foo(ty: ApplicationTy) { // { dg-error "could not resolve type path 'ApplicationTy'" "4140" { target *-*-* } .-1 } +pub fn foo(ty: ApplicationTy) { // { dg-error "could not resolve type path 'ApplicationTy'" } match ty { ty_app!(bean::Array) => {} } diff --git a/gcc/testsuite/rust/compile/issue-4140-2.rs b/gcc/testsuite/rust/compile/issue-4140-2.rs index 507cf2aba38..bcccddb3329 100644 --- a/gcc/testsuite/rust/compile/issue-4140-2.rs +++ b/gcc/testsuite/rust/compile/issue-4140-2.rs @@ -1,11 +1,12 @@ macro_rules! ty_app { ($_a:pat) => { - ($ctor) // { dg-error "unrecognised token '$' in grouped or tuple pattern after first pattern" "4140" { target *-*-* } . } + ($ctor) }; } pub fn foo() { - match ty { // { dg-error "Cannot find path 'ty' in this scope" "4140" { target *-*-* } .-1 } - ty_app!(bean::Array) => {} + match ty { + // { dg-error "Cannot find path" "4140" { target *-*-* } 0 } + ty_app!(bean::Array) => {} // { dg-error "unrecognised token" "4140" { target *-*-* } 0 } } }