exp_ch4.adb (Expand_N_Op_Expon): Deal with problem of wrong order in calling Duplicat...
authorRobert Dewar <dewar@adacore.com>
Tue, 26 May 2015 08:12:15 +0000 (08:12 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 26 May 2015 08:12:15 +0000 (10:12 +0200)
2015-05-26  Robert Dewar  <dewar@adacore.com>

* exp_ch4.adb (Expand_N_Op_Expon): Deal with problem of wrong
order in calling Duplicate_Subexpr.
* einfo.ads: Fix documentation of Object/Value size for scalar types.

From-SVN: r223665

gcc/ada/ChangeLog
gcc/ada/einfo.ads
gcc/ada/exp_ch4.adb

index da387055e6734b343545f17fc9171e9f2d508cb0..c0d03c39478a808e20b7c95ad6f80d5f7908951a 100644 (file)
@@ -1,3 +1,9 @@
+2015-05-26  Robert Dewar  <dewar@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Op_Expon): Deal with problem of wrong
+       order in calling Duplicate_Subexpr.
+       * einfo.ads: Fix documentation of Object/Value size for scalar types.
+
 2015-05-26  Ed Schonberg  <schonberg@adacore.com>
 
        * exp_aggr.adb (Build_Array_Aggr_Code, Gen_Assign):
index 5a309f914dbb750d50f522ee203064b960864dfa..b5d776991effbeda54233aa6327669232aca1885 100644 (file)
@@ -218,11 +218,13 @@ package Einfo is
 
 --     subtype x4 is x2'base range 0 .. 10;        8               4
 
---     subtype x5 is x2 range 0 .. dynamic;       16              (7)
+--     dynamic : x2'Base range -64 .. +63;
 
---     subtype x6 is x2'base range 0 .. dynamic;   8              (7)
+--     subtype x5 is x2 range 0 .. dynamic;       16               3*
 
---  Note: the entries marked (7) are not actually specified by the Ada 95 RM,
+--     subtype x6 is x2'base range 0 .. dynamic;   8               7*
+
+--  Note: the entries marked * are not actually specified by the Ada 95 RM,
 --  but it seems in the spirit of the RM rules to allocate the minimum number
 --  of bits known to be large enough to hold the given range of values.
 
index 7bd3c6be15770554311a4bf809dbe1a744d50e09..4dcc9be7bb926a4fe2e41ac034d4e131d19fccc3 100644 (file)
@@ -7779,6 +7779,9 @@ package body Exp_Ch4 is
                TestS : Boolean;
                --  Set True if we must test the shift count
 
+               Test_Gt : Node_Id;
+               --  Node for test against TestS
+
             begin
                --  Compute maximum shift based on the underlying size. For a
                --  modular type this is one less than the size.
@@ -7841,15 +7844,21 @@ package body Exp_Ch4 is
                   --  zero if this shift count is exceeded.
 
                   if TestS then
+
+                     --  Note: build node for the comparison first, before we
+                     --  reuse the Right_Opnd, so that we have proper parents
+                     --  in place for the Duplicate_Subexpr call.
+
+                     Test_Gt :=
+                       Make_Op_Gt (Loc,
+                         Left_Opnd  => Duplicate_Subexpr (Right_Opnd (N)),
+                         Right_Opnd => Make_Integer_Literal (Loc, MaxS));
+
                      Rewrite (N,
                        Make_If_Expression (Loc,
                          Expressions => New_List (
-                           Make_Op_Gt (Loc,
-                             Left_Opnd  => Duplicate_Subexpr (Right_Opnd (N)),
-                             Right_Opnd => Make_Integer_Literal (Loc, MaxS)),
-
+                           Test_Gt,
                            Make_Integer_Literal (Loc, Uint_0),
-
                            Make_Op_Shift_Left (Loc,
                              Left_Opnd  => Make_Integer_Literal (Loc, Uint_1),
                              Right_Opnd => Right_Opnd (N)))));