diff options
author | Ed Schonberg <schonberg@adacore.com> | 2008-05-27 10:49:55 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2008-05-27 10:49:55 +0200 |
commit | 393148620c7bb43f25c976a32daf205c90f33b54 (patch) | |
tree | da60cbc457c2d67cba5c142c15adad7c00a41d7f | |
parent | 4c4e9ad2b2fd7277af83f62cef018e4f90115e41 (diff) | |
download | gcc-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.adb | 23 |
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; |