From: jayant chauhan <0001jayant@gmail.com> Date: Sun, 1 Feb 2026 13:18:28 +0000 (+0530) Subject: gccrs: parser: Fix ICE in AnonConst by handling null macro result X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=91c0dff5482d716cfd11729668dfeea9ae784dbb;p=thirdparty%2Fgcc.git 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> --- diff --git a/gcc/rust/parse/rust-parse-impl-expr.hxx b/gcc/rust/parse/rust-parse-impl-expr.hxx index 4de5599d62e..2a2d844b7fa 100644 --- a/gcc/rust/parse/rust-parse-impl-expr.hxx +++ b/gcc/rust/parse/rust-parse-impl-expr.hxx @@ -1957,9 +1957,15 @@ Parser::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::CHILD_ERROR); + return std::unique_ptr (std::move (macro)); + } case LEFT_CURLY: { bool not_a_block = lexer.peek_token (1)->get_id () == IDENTIFIER diff --git a/gcc/testsuite/rust/compile/issue-4412.rs b/gcc/testsuite/rust/compile/issue-4412.rs new file mode 100644 index 00000000000..6ed93d0d789 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4412.rs @@ -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() {} \ No newline at end of file