[Ada] Fix incorrect operand sharing after expansion

2020-06-17  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_ch4.adb (Expand_N_Op_Expon): Replace all occurrences of
	the original right operand with the relocated version.
This commit is contained in:
Eric Botcazou 2020-04-16 23:42:13 +02:00 committed by Pierre-Marie de Rodat
parent 765005dd67
commit 67b2ed8e56

View File

@ -8778,8 +8778,7 @@ package body Exp_Ch4 is
-- Determine range to see if it can be larger than MaxS
Determine_Range
(Right_Opnd (N), OK, Lo, Hi, Assume_Valid => True);
Determine_Range (Exp, OK, Lo, Hi, Assume_Valid => True);
TestS := (not OK) or else Hi > MaxS;
-- Signed integer case
@ -8796,7 +8795,7 @@ package body Exp_Ch4 is
Make_Raise_Constraint_Error (Loc,
Condition =>
Make_Op_Gt (Loc,
Left_Opnd => Duplicate_Subexpr (Right_Opnd (N)),
Left_Opnd => Duplicate_Subexpr (Exp),
Right_Opnd => Make_Integer_Literal (Loc, MaxS)),
Reason => CE_Overflow_Check_Failed));
end if;
@ -8806,7 +8805,7 @@ package body Exp_Ch4 is
Rewrite (N,
Make_Op_Shift_Left (Loc,
Left_Opnd => Make_Integer_Literal (Loc, Uint_1),
Right_Opnd => Right_Opnd (N)));
Right_Opnd => Exp));
-- Modular integer case
@ -8824,7 +8823,7 @@ package body Exp_Ch4 is
Test_Gt :=
Make_Op_Gt (Loc,
Left_Opnd => Duplicate_Subexpr (Right_Opnd (N)),
Left_Opnd => Duplicate_Subexpr (Exp),
Right_Opnd => Make_Integer_Literal (Loc, MaxS));
Rewrite (N,
@ -8834,7 +8833,7 @@ package body Exp_Ch4 is
Make_Integer_Literal (Loc, Uint_0),
Make_Op_Shift_Left (Loc,
Left_Opnd => Make_Integer_Literal (Loc, Uint_1),
Right_Opnd => Right_Opnd (N)))));
Right_Opnd => Exp))));
-- If we know shift count cannot be greater than MaxS, then
-- it is safe to just rewrite as a shift with no test.
@ -8843,7 +8842,7 @@ package body Exp_Ch4 is
Rewrite (N,
Make_Op_Shift_Left (Loc,
Left_Opnd => Make_Integer_Literal (Loc, Uint_1),
Right_Opnd => Right_Opnd (N)));
Right_Opnd => Exp));
end if;
end if;