]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: fix segfault in clone_pattern w macro
authorlenny.chiadmi-delage <lenny.chiadmi-delage@epita.fr>
Wed, 15 Oct 2025 15:07:05 +0000 (15:07 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 25 Nov 2025 22:00:50 +0000 (23:00 +0100)
Check if parser throw an error to avoid cloning nullptr

Fixes Rust-GCC#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 <lenny.chiadmi-delage@epita.fr>
gcc/rust/expand/rust-macro-expand.cc

index 52f8e2b10e33e86f18d1447c8d53882cb15da77a..b47e43afd76425ea3358836d59c2d91dbf9be6c5 100644 (file)
@@ -962,12 +962,10 @@ transcribe_expression (Parser<MacroInvocLexer> &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<MacroInvocLexer> &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<MacroInvocLexer> &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)},