From patchwork Mon Oct 29 09:55:39 2012
ContentType: text/plain; charset="utf8"
MIMEVersion: 1.0
ContentTransferEncoding: 7bit
Subject: [Ada] Special case for case expression alternative moved in caller
XPatchworkSubmitter: Arnaud Charlet
XPatchworkId: 194930
MessageId: <20121029095538.GA14620@adacore.com>
To: gccpatches@gcc.gnu.org
Cc: Yannick Moy
Date: Mon, 29 Oct 2012 05:55:39 0400
From: Arnaud Charlet
ListId:
Is_Signed_Integer_Arithmetic_Op is called to recognize an arithmetic operation
on signed integers, or on if expressions and case expressions whose dependent
expressions are arithmetic operation on signed integers. A special case was
included for N_Case_Expression_Alternative which should have been included in
the caller Apply_Arithmetic_Overflow_Minimized_Eliminated. Now done.
Tested on x86_64pclinuxgnu, committed on trunk
20121029 Yannick Moy
* checks.adb (Apply_Arithmetic_Overflow_Minimized_Eliminated):
Add special case for case expression alternative.
(Is_Signed_Integer_Arithmetic_Op): Remove special case for case
expression alternative.
* exp_ch4.adb Minor reformatting.
Index: checks.adb
===================================================================
 checks.adb (revision 192908)
+++ checks.adb (working copy)
@@ 1108,8 +1108,12 @@
or else Nkind (P) in N_Membership_Test
or else Nkind (P) in N_Op_Compare
  We may also be a range operand in a membership test
+  This is also true for an alternative in a case expression
+ or else Nkind (P) = N_Case_Expression_Alternative
+
+  This is also true for a range operand in a membership test
+
or else (Nkind (P) = N_Range
and then Nkind (Parent (P)) in N_Membership_Test)
then
@@ 6268,9 +6272,6 @@
when N_If_Expression  N_Case_Expression =>
return Is_Signed_Integer_Type (Etype (N));
 when N_Case_Expression_Alternative =>
 return Is_Signed_Integer_Type (Etype (Parent (N)));

when others =>
return False;
end case;
Index: exp_ch4.adb
===================================================================
 exp_ch4.adb (revision 192908)
+++ exp_ch4.adb (working copy)
@@ 3877,8 +3877,8 @@
end if;
 Right operand is a subtype name and the subtype has a predicate. We
  have to make sure predicate is checked, and for that we need to use
  the standard N_In circuitry with appropriate types.
+  have to make sure the predicate is checked, and for that we need to
+  use the standard N_In circuitry with appropriate types.
else
pragma Assert (Present (Predicate_Function (Etype (Rop))));
@@ 3921,7 +3921,7 @@
 Bnn
 end
  A bit gruesome, but here goes.
+  A bit gruesome, but there doesn't seem to be a simpler way
declare
Blk : constant Node_Id := Make_Bignum_Block (Loc);
@@ 3937,10 +3937,8 @@
Nin :=
Make_In (Loc,
 Left_Opnd =>
 Convert_To (Base_Type (Etype (Rop)),
 New_Occurrence_Of (Lnn, Loc)),
 Right_Opnd => New_Occurrence_Of (Etype (Rop), Loc));
+ Left_Opnd => Convert_To (TB, New_Occurrence_Of (Lnn, Loc)),
+ Right_Opnd => New_Occurrence_Of (T, Loc));
Set_No_Minimize_Eliminate (Nin);
 Now decorate the block