aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2008-05-27 10:49:55 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2008-05-27 10:49:55 +0200
commit393148620c7bb43f25c976a32daf205c90f33b54 (patch)
treeda60cbc457c2d67cba5c142c15adad7c00a41d7f
parent4c4e9ad2b2fd7277af83f62cef018e4f90115e41 (diff)
downloadgcc-393148620c7bb43f25c976a32daf205c90f33b54.zip
gcc-393148620c7bb43f25c976a32daf205c90f33b54.tar.gz
gcc-393148620c7bb43f25c976a32daf205c90f33b54.tar.bz2
exp_disp.adb (Build_Dispatch_Tables): For a private type completed by a synchronized tagged type...
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
-rw-r--r--gcc/ada/exp_disp.adb23
1 files changed, 13 insertions, 10 deletions
diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb
index 860fd17..86420695 100644
--- a/gcc/ada/exp_disp.adb
+++ b/gcc/ada/exp_disp.adb
@@ -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;