diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-04-02 21:59:50 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:28:43 +0100 |
commit | 072d8e660bbd0996f5b2ff3567a45c9876986052 (patch) | |
tree | 4f17eb92cb77687f38b99af0c3902533067ea87e /gcc | |
parent | 8bc2a3e40e86a6a125c985f05616537c130cb2cb (diff) | |
download | gcc-072d8e660bbd0996f5b2ff3567a45c9876986052.zip gcc-072d8e660bbd0996f5b2ff3567a45c9876986052.tar.gz gcc-072d8e660bbd0996f5b2ff3567a45c9876986052.tar.bz2 |
gccrs: Fix ICE using constructors for intilizers in statics
We are getting constant expressions for the initilizers for static items
this hits an assertion in the GCC middle-end which is looking for a
constructor so we need to unwrap the constant expression using DECL_INITIAL
as the initilizer to the global static.
Fixes #2080
gcc/rust/ChangeLog:
* backend/rust-compile-item.cc (CompileItem::visit): unwrap the constant expression
gcc/testsuite/ChangeLog:
* rust/execute/torture/issue-2080.rs: New test.
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/backend/rust-compile-item.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/issue-2080.rs | 26 |
2 files changed, 29 insertions, 3 deletions
diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index f9e9616..4b37b15 100644 --- a/gcc/rust/backend/rust-compile-item.cc +++ b/gcc/rust/backend/rust-compile-item.cc @@ -18,9 +18,7 @@ #include "rust-compile-item.h" #include "rust-compile-implitem.h" -#include "rust-compile-expr.h" #include "rust-compile-extern.h" -#include "rust-constexpr.h" namespace Rust { namespace Compile { @@ -66,7 +64,9 @@ CompileItem::visit (HIR::StaticItem &var) = ctx->get_backend ()->global_variable (name, asm_name, type, is_external, is_hidden, in_unique_section, var.get_locus ()); - ctx->get_backend ()->global_variable_set_init (static_global, value); + + tree init = value == error_mark_node ? error_mark_node : DECL_INITIAL (value); + ctx->get_backend ()->global_variable_set_init (static_global, init); ctx->insert_var_decl (var.get_mappings ().get_hirid (), static_global); ctx->push_var (static_global); diff --git a/gcc/testsuite/rust/execute/torture/issue-2080.rs b/gcc/testsuite/rust/execute/torture/issue-2080.rs new file mode 100644 index 0000000..dbdbf41 --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/issue-2080.rs @@ -0,0 +1,26 @@ +// { dg-output "hello world: gccrs\n" } +// { dg-additional-options "-w" } +static TEST_1: &str = "gccrs"; +static TEST_2: i32 = 123; + +struct Foo(i32, bool); +static TEST_3: Foo = Foo(123, false); + +extern "C" { + fn printf(s: *const i8, ...); +} + +fn main() -> i32 { + unsafe { + let a1 = "hello world: %s\n"; + let b1 = a1 as *const str; + let c1 = b1 as *const i8; + + let a2 = TEST_1; + let b2 = a2 as *const str; + let c2 = b2 as *const i8; + + printf(c1, c2); + } + 0 +} |