From a849f6cd9867cb90c867a440eb17aec090f64557 Mon Sep 17 00:00:00 2001 From: "lenny.chiadmi-delage" Date: Wed, 15 Oct 2025 15:07:05 +0000 Subject: [PATCH] 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): check if parser didn't fail (transcribe_pattern): check if parser didn't fail 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)},