From def15641da84fb82adfeb946c6d714683148e6e3 Mon Sep 17 00:00:00 2001 From: Thomas Quinot Date: Wed, 26 Sep 2018 09:20:05 +0000 Subject: [PATCH] [Ada] Fix inheritance of representation items defined as aspects When a representation item is defined by a pragma or attribute definition clause, the entity it applies to is that of the Name of the representation item. But when it is defined by an aspect definition, the entity is directly denoted by the Entity attribute of the represenation item. The circuitry that inherits representation items for derived types or subtypes must account for these two possible cases. 2018-09-26 Thomas Quinot gcc/ada/ * sem_ch13.adb (Inherit_Aspects_At_Freeze_Point): For a representation item that is an N_Aspect_Definition, retrieve the entity it applies to using the Entity attribute. gcc/testsuite/ * gnat.dg/sso13.adb: New testcase. From-SVN: r264636 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/sem_ch13.adb | 24 ++++++++++++++++++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/sso13.adb | 24 ++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/sso13.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f460963d590..38354ec10f2 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-09-26 Thomas Quinot + + * sem_ch13.adb (Inherit_Aspects_At_Freeze_Point): For a + representation item that is an N_Aspect_Definition, retrieve the + entity it applies to using the Entity attribute. + 2018-09-26 Justin Squirek * sem_ch8.adb (Analyze_Subprogram_Renaming): Add extra condition diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 00854c9be58..b999be63034 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -11446,6 +11446,26 @@ package body Sem_Ch13 is -- specification node whose correponding pragma (if any) is present in -- the Rep Item chain of the entity it has been specified to. + function Rep_Item_Entity (Rep_Item : Node_Id) return Entity_Id; + -- Return the entity for which Rep_Item is specified + + --------------------- + -- Rep_Item_Entity -- + --------------------- + + function Rep_Item_Entity (Rep_Item : Node_Id) return Entity_Id is + begin + if Nkind (Rep_Item) = N_Aspect_Specification then + return Entity (Rep_Item); + + else + pragma Assert (Nkind_In (Rep_Item, + N_Pragma, + N_Attribute_Definition_Clause)); + return Entity (Name (Rep_Item)); + end if; + end Rep_Item_Entity; + -------------------------------------------------- -- Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item -- -------------------------------------------------- @@ -11650,8 +11670,8 @@ package body Sem_Ch13 is and then Has_Rep_Item (Typ, Name_Bit_Order) then Set_Reverse_Bit_Order (Bas_Typ, - Reverse_Bit_Order (Entity (Name - (Get_Rep_Item (Typ, Name_Bit_Order))))); + Reverse_Bit_Order (Rep_Item_Entity + (Get_Rep_Item (Typ, Name_Bit_Order)))); end if; end if; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be0c2c3d1ba..c96126cb14e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-09-26 Thomas Quinot + + * gnat.dg/sso13.adb: New testcase. + 2018-09-26 Justin Squirek * gnat.dg/warn16.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/sso13.adb b/gcc/testsuite/gnat.dg/sso13.adb new file mode 100644 index 00000000000..26ef7624f06 --- /dev/null +++ b/gcc/testsuite/gnat.dg/sso13.adb @@ -0,0 +1,24 @@ +-- { dg-do compile } + +with System; + +procedure SSO13 is + type Pulse_Buffer_Type is abstract tagged null record + with Bit_Order => System.High_Order_First, + Scalar_Storage_order =>System.High_order_First; -- { dg-warning "scalar storage order specified but no component clause" } + type Pulse_Train_Type is abstract new Pulse_Buffer_Type with null record; + type WO_Pulse_Train_Type is new Pulse_Train_Type with null record; + type WO_Confirmation_Pulse_Train_Type is new WO_Pulse_Train_Type with record + null; + end record; + + type Update_Dwell_Type is abstract tagged null record + with Bit_Order => System.High_Order_First, + Scalar_Storage_order =>System.High_order_First; -- { dg-warning "scalar storage order specified but no component clause" } + type Confirmation_Dwell_Type is new Update_Dwell_Type with + record + Pulses : aliased WO_Pulse_Train_Type; -- (Location of Error #1) + end record; +begin + null; +end; -- 2.30.2