exp_ch3.adb (Build_Initialization_Call): Call Underlying_Type to go down the chain...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 1 Aug 2014 13:51:43 +0000 (13:51 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 1 Aug 2014 13:51:43 +0000 (15:51 +0200)
2014-08-01  Eric Botcazou  <ebotcazou@adacore.com>

* exp_ch3.adb (Build_Initialization_Call): Call Underlying_Type
to go down the chain of private derivations.
* freeze.adb (Freeze_Entity): Fix typo in comment.

From-SVN: r213465

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb
gcc/ada/freeze.adb

index 225c24cafa3dec794b31be67880564569a219d80..a7a0e2b7a3f40c13525af3aa897e126e18d9c6be 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_ch3.adb (Build_Initialization_Call): Call Underlying_Type
+       to go down the chain of private derivations.
+       * freeze.adb (Freeze_Entity): Fix typo in comment.
+
 2014-08-01  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch3.adb (Access_Type_Declaration): If designated type is
index 48008b02998748dddbe572435b9a1c39d139c03e..f90c60d7fcdd946df4df35bb095803dd87b3a513 100644 (file)
@@ -1491,14 +1491,20 @@ package body Exp_Ch3 is
          return Empty_List;
       end if;
 
-      --  Go to full view if private type. In the case of successive
-      --  private derivations, this can require more than one step.
+      --  Go to full view or underlying full view if private type. In the case
+      --  of successive private derivations, this can require two steps.
 
-      while Is_Private_Type (Full_Type)
+      if Is_Private_Type (Full_Type)
         and then Present (Full_View (Full_Type))
-      loop
+      then
          Full_Type := Full_View (Full_Type);
-      end loop;
+      end if;
+
+      if Is_Private_Type (Full_Type)
+        and then Present (Underlying_Full_View (Full_Type))
+      then
+         Full_Type := Underlying_Full_View (Full_Type);
+      end if;
 
       --  If Typ is derived, the procedure is the initialization procedure for
       --  the root type. Wrap the argument in an conversion to make it type
@@ -1583,12 +1589,6 @@ package body Exp_Ch3 is
             begin
                if Is_Protected_Type (T) then
                   T := Corresponding_Record_Type (T);
-
-               elsif Is_Private_Type (T)
-                 and then Present (Underlying_Full_View (T))
-                 and then Is_Protected_Type (Underlying_Full_View (T))
-               then
-                  T := Corresponding_Record_Type (Underlying_Full_View (T));
                end if;
 
                Arg :=
index 9af48a8622e5d2e7a82302e6adc5e7034e8c85a6..8963ad0c772d08c7a52abe1de31dee4bc7f577f9 100644 (file)
@@ -5034,7 +5034,7 @@ package body Freeze is
                --  Otherwise freeze full view and patch the pointers so that
                --  the freeze node will elaborate both views in the back end.
                --  However, if full view is itself private, freeze underlying
-               --  full view instead and patch the pointer so that the freeze
+               --  full view instead and patch the pointers so that the freeze
                --  node will elaborate the three views in the back end.
 
                else