Signed-off-by: Jose E. Marchesi <[email protected]>
gcc/algol68/ChangeLog
PR algol68/124028
* a68-low-bits.cc (a68_bits_shift): Avoid uninitialized save_expr.
gcc/testsuite/ChangeLog
PR algol68/124028
* algol68/execute/bits-shift-4.a68: New test.
---
gcc/algol68/a68-low-bits.cc | 14 ++++++++------
gcc/testsuite/algol68/execute/bits-shift-4.a68 | 10 ++++++++++
2 files changed, 18 insertions(+), 6 deletions(-)
create mode 100644 gcc/testsuite/algol68/execute/bits-shift-4.a68
diff --git a/gcc/algol68/a68-low-bits.cc b/gcc/algol68/a68-low-bits.cc
index 81b4f98c4fa..1857b830cb1 100644
--- a/gcc/algol68/a68-low-bits.cc
+++ b/gcc/algol68/a68-low-bits.cc
@@ -283,12 +283,14 @@ a68_bits_shift (NODE_T *p, tree shift, tree bits)
shift, build_zero_cst
(shift_type)),
shifted_right, shifted_left);
- return fold_build3_loc (a68_get_node_location (p),
- COND_EXPR,
- TREE_TYPE (bits),
- fold_build2 (LT_EXPR, TREE_TYPE (abs_shift),
- abs_shift, a68_bits_width (bits_type)),
- shifted_bits, build_zero_cst (bits_type));
+ return fold_build2 (COMPOUND_EXPR, TREE_TYPE (bits),
+ bits,
+ fold_build3_loc (a68_get_node_location (p),
+ COND_EXPR,
+ TREE_TYPE (bits),
+ fold_build2 (LT_EXPR, TREE_TYPE
(abs_shift),
+ abs_shift, a68_bits_width
(bits_type)),
+ shifted_bits, build_zero_cst
(bits_type)));
}
/* Given two bits values, build an expression that calculates whether A = B.
*/
diff --git a/gcc/testsuite/algol68/execute/bits-shift-4.a68
b/gcc/testsuite/algol68/execute/bits-shift-4.a68
new file mode 100644
index 00000000000..87188fbf2dd
--- /dev/null
+++ b/gcc/testsuite/algol68/execute/bits-shift-4.a68
@@ -0,0 +1,10 @@
+begin
+ int shft := 2;
+
+ int i := 12;
+ bits x = BIN i;
+ int j := Abs(x Shl 2);
+ int k := Abs(x Shl shft);
+
+ assert (j = k)
+end
--
2.39.5