exp_disp.adb (Build_Dispatch_Tables): For a private type completed by a synchronized...
authorEd Schonberg <schonberg@adacore.com>
Tue, 27 May 2008 08:49:55 +0000 (10:49 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 27 May 2008 08:49:55 +0000 (10:49 +0200)
2008-05-27  Ed Schonberg  <schonberg@adacore.com>

* exp_disp.adb (Build_Dispatch_Tables): For a private type completed by
a synchronized tagged type, do not attempt to build dispatch table for
full view. The table is built for the corresponding record type, which
has its own declaration.

From-SVN: r135978

gcc/ada/exp_disp.adb

index 860fd17352cc90d5683cb588d6591debfdc7469b..864206951f64e39c60565d5e649ce4d31e78d074 100644 (file)
@@ -173,25 +173,28 @@ package body Exp_Disp is
 
             --  Handle private types of library level tagged types. We must
             --  exchange the private and full-view to ensure the correct
-            --  expansion.
+            --  expansion. If the full view is a synchronized type ignore
+            --  the type because the table will be built for the corresponding
+            --  record type, that has its own declaration.
 
             elsif (Nkind (D) = N_Private_Type_Declaration
                      or else Nkind (D) = N_Private_Extension_Declaration)
                and then Present (Full_View (Defining_Entity (D)))
-               and then Is_Library_Level_Tagged_Type
-                          (Full_View (Defining_Entity (D)))
-               and then Ekind (Full_View (Defining_Entity (D)))
-                          /= E_Record_Subtype
             then
                declare
                   E1 : constant Entity_Id := Defining_Entity (D);
-                  E2 : constant Entity_Id := Full_View (Defining_Entity (D));
+                  E2 : constant Entity_Id := Full_View (E1);
 
                begin
-                  Exchange_Declarations (E1);
-                  Insert_List_After_And_Analyze (Last (Target_List),
-                    Make_DT (E1));
-                  Exchange_Declarations (E2);
+                  if Is_Library_Level_Tagged_Type (E2)
+                    and then Ekind (E2) /= E_Record_Subtype
+                    and then not Is_Concurrent_Type (E2)
+                  then
+                     Exchange_Declarations (E1);
+                     Insert_List_After_And_Analyze (Last (Target_List),
+                       Make_DT (E1));
+                     Exchange_Declarations (E2);
+                  end if;
                end;
             end if;