mirror of
https://github.com/openRuyi-Project/gcc.git
synced 2026-09-06 14:01:37 +00:00
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:
committed by
Arthur Cohen
parent
e778339f5b
commit
91c0dff548
@@ -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
|
||||
|
||||
@@ -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() {}
|
||||
Reference in New Issue
Block a user