gccrs: parser: Fix ICE in AnonConst by handling null macro result

The parse_anon_const function triggered an assertion failure (ICE) when
receiving a success Result containing a null expression pointer. This
occurred because null_denotation_path directly returned the result of
parse_macro_invocation_partial (which returns a raw pointer) without
checking for failure.

When parse_macro_invocation_partial failed (returning nullptr), it was
wrapped into a tl::expected success state containing nullptr, rather than
an error state.

This patch adds a check in null_denotation_path to verify if the parsed
macro invocation is null. If it is, it now returns a tl::unexpected error,
ensuring that invalid expressions are correctly reported as errors
upstream.

Fixes Rust-GCC#4412

gcc/rust/ChangeLog:

	* parse/rust-parse-impl-expr.hxx (null_denotation_path): Check
	if macro invocation returns null and return error.

gcc/testsuite/ChangeLog:

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

Signed-off-by: Jayant Chauhan <0001jayant@gmail.com>
This commit is contained in:
jayant chauhan
2026-02-27 15:57:10 +01:00
committed by Arthur Cohen
parent e778339f5b
commit 91c0dff548
2 changed files with 18 additions and 3 deletions
+9 -3
View File
@@ -1957,9 +1957,15 @@ Parser<ManagedTokenSource>::null_denotation_path (
switch (t->get_id ())
{
case EXCLAM:
// macro
return parse_macro_invocation_partial (std::move (path),
std::move (outer_attrs));
{
// macro
auto macro = parse_macro_invocation_partial (std::move (path),
std::move (outer_attrs));
if (macro == nullptr)
return tl::unexpected<Parse::Error::Expr> (
Parse::Error::Expr::CHILD_ERROR);
return std::unique_ptr<AST::Expr> (std::move (macro));
}
case LEFT_CURLY:
{
bool not_a_block = lexer.peek_token (1)->get_id () == IDENTIFIER
+9
View File
@@ -0,0 +1,9 @@
// { dg-options "-frust-incomplete-and-experimental-compiler-do-not-use" }
#![feature(no_core)]
#![no_core]
struct Bug([u8; panic!"\t"]);
// { dg-error "unexpected token" "" { target *-*-* } .-1 }
// { dg-error "failed to parse" "" { target *-*-* } .-2 }
// { dg-error "could not parse" "" { target *-*-* } .-3 }
// { dg-error "expecting" "" { target *-*-* } .-4 }
fn main() {}