Fix internal error with Shift_Right operator on signed type
This is a regression present on the mainline and 10 branch in the form of an ICE with a shift operator applied to a variable of a signed type, and which is caused by a type mismatch. gcc/ada/ChangeLog: * gcc-interface/trans.c (gnat_to_gnu) <N_Op_Shift>: Also convert GNU_MAX_SHIFT if the type of the operation has been changed. * gcc-interface/utils.c (can_materialize_object_renaming_p): Add pair of missing parentheses. gcc/testsuite/ChangeLog: * gnat.dg/shift1.adb: New test.
This commit is contained in:
parent
4ac93608d7
commit
1f8fc1f458
3 changed files with 18 additions and 1 deletions
|
@ -7085,6 +7085,8 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
if (TREE_CODE (gnu_lhs) == INTEGER_CST && ignore_lhs_overflow)
|
||||
TREE_OVERFLOW (gnu_lhs) = TREE_OVERFLOW (gnu_old_lhs);
|
||||
gnu_rhs = convert (gnu_type, gnu_rhs);
|
||||
if (gnu_max_shift)
|
||||
gnu_max_shift = convert (gnu_type, gnu_max_shift);
|
||||
}
|
||||
|
||||
/* For signed integer addition, subtraction and multiplication, do an
|
||||
|
|
|
@ -5837,7 +5837,7 @@ can_materialize_object_renaming_p (Node_Id expr)
|
|||
{
|
||||
expr = Original_Node (expr);
|
||||
|
||||
switch Nkind (expr)
|
||||
switch (Nkind (expr))
|
||||
{
|
||||
case N_Identifier:
|
||||
case N_Expanded_Name:
|
||||
|
|
15
gcc/testsuite/gnat.dg/shift1.adb
Normal file
15
gcc/testsuite/gnat.dg/shift1.adb
Normal file
|
@ -0,0 +1,15 @@
|
|||
-- { dg-do compile }
|
||||
-- { dg-options "-gnatws" }
|
||||
|
||||
procedure Shift1 is
|
||||
|
||||
type T_Integer_8 is range -2 ** 7 .. 2 ** 7 - 1
|
||||
with Size => 8;
|
||||
|
||||
pragma Provide_Shift_Operators (T_Integer_8);
|
||||
|
||||
X : T_Integer_8;
|
||||
|
||||
begin
|
||||
X := Shift_Right (X, 1);
|
||||
end;
|
Loading…
Add table
Reference in a new issue