aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2025-03-31 17:58:24 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2025-04-08 10:17:11 +0200
commite873e2a0b15871fb0bcdb07155fc9a7407f66286 (patch)
tree649eab7e338395eb2c4411799879014e9663317a /gcc
parent0282fd7cabe365e639deb8848cf29fbd00470e63 (diff)
downloadgcc-e873e2a0b15871fb0bcdb07155fc9a7407f66286.zip
gcc-e873e2a0b15871fb0bcdb07155fc9a7407f66286.tar.gz
gcc-e873e2a0b15871fb0bcdb07155fc9a7407f66286.tar.bz2
gccrs: Fix ICE when doing shift checks on const decl
Const decls are just delcarations wrapping the value into the DECL_INITIAL and the shift checks we have assume no decls are involved and its just flat values. This patch simply unwraps the constant values if they exist. Fixes Rust-GCC#3665 gcc/rust/ChangeLog: * rust-gcc.cc (arithmetic_or_logical_expression): unwrap const decls gcc/testsuite/ChangeLog: * rust/compile/issue-3665.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/rust-gcc.cc6
-rw-r--r--gcc/testsuite/rust/compile/issue-3665.rs6
2 files changed, 12 insertions, 0 deletions
diff --git a/gcc/rust/rust-gcc.cc b/gcc/rust/rust-gcc.cc
index a6e8ea9..72aef08 100644
--- a/gcc/rust/rust-gcc.cc
+++ b/gcc/rust/rust-gcc.cc
@@ -1074,6 +1074,12 @@ arithmetic_or_logical_expression (ArithmeticOrLogicalOperator op, tree left,
if (left == error_mark_node || right == error_mark_node)
return error_mark_node;
+ // unwrap the const decls if set
+ if (TREE_CODE (left) == CONST_DECL)
+ left = DECL_INITIAL (left);
+ if (TREE_CODE (right) == CONST_DECL)
+ right = DECL_INITIAL (right);
+
/* We need to determine if we're doing floating point arithmetics of integer
arithmetics. */
bool floating_point = is_floating_point (left);
diff --git a/gcc/testsuite/rust/compile/issue-3665.rs b/gcc/testsuite/rust/compile/issue-3665.rs
new file mode 100644
index 0000000..d66a81f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3665.rs
@@ -0,0 +1,6 @@
+pub const uint_val: usize = 1;
+pub const uint_expr: usize = 1 << uint_val;
+
+pub fn test() -> usize {
+ uint_expr
+}