diff options
author | Philip Herron <herron.philip@googlemail.com> | 2025-03-26 17:11:36 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2025-03-27 13:21:56 +0000 |
commit | 23097f8132bcaf252020ed04758af71365758a8f (patch) | |
tree | 4e34c1ceb2b46caaa14b1dce30ab51d3b5016d03 /gcc/rust/backend | |
parent | b322656cdc0e3beae61be8465adab23fbcc3dbbf (diff) | |
download | gcc-23097f8132bcaf252020ed04758af71365758a8f.zip gcc-23097f8132bcaf252020ed04758af71365758a8f.tar.gz gcc-23097f8132bcaf252020ed04758af71365758a8f.tar.bz2 |
gccrs: Fix ICE when array elements are not a value
We need to check for error_mark_node when doing adjustments from coercion
sites otherwise we hit assetions as part of the coercion. That fixes the
ICE but the reason for the error_mark_node is because the array element
value.
Fixes Rust-GCC#3567
gcc/rust/ChangeLog:
* backend/rust-compile-expr.cc (CompileExpr::array_value_expr): add value chk for array expr
gcc/testsuite/ChangeLog:
* rust/compile/issue-3567.rs: New test.
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.cc | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index 021495a..4760348 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -1902,6 +1902,14 @@ CompileExpr::array_value_expr (location_t expr_locus, for (auto &elem : elems.get_values ()) { tree translated_expr = CompileExpr::Compile (*elem, ctx); + if (translated_expr == error_mark_node) + { + rich_location r (line_table, expr_locus); + r.add_fixit_replace (elem->get_locus (), "not a value"); + rust_error_at (r, ErrorCode::E0423, "expected value"); + return error_mark_node; + } + constructor.push_back (translated_expr); indexes.push_back (i++); } @@ -2003,6 +2011,9 @@ HIRCompileBase::resolve_adjustements ( tree e = expression; for (auto &adjustment : adjustments) { + if (e == error_mark_node) + return error_mark_node; + switch (adjustment.get_type ()) { case Resolver::Adjustment::AdjustmentType::ERROR: |