public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-4958] ada: Fix support of Default_Component_Value aspect on derived types
@ 2023-01-03  9:33 Marc Poulhi?s
  0 siblings, 0 replies; only message in thread
From: Marc Poulhi?s @ 2023-01-03  9:33 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e1e2b0070302169fbf3f3fd95a13ec819e71e2a5

commit r13-4958-ge1e2b0070302169fbf3f3fd95a13ec819e71e2a5
Author: Eric Botcazou <ebotcazou@adacore.com>
Date:   Mon Dec 5 22:31:50 2022 +0100

    ada: Fix support of Default_Component_Value aspect on derived types
    
    The support of the Default_Component_Value aspect on derived constrained
    array types is broken because of a couple of issues: 1) the derived types
    incorrectly inherit the initialization procedure of the ancestor types
    and 2) the propagation of the aspect does not work for constrained array
    types (unlike for unconstrained array types).
    
    gcc/ada/
    
            * exp_tss.adb (Base_Init_Proc): Do not return the Init_Proc of the
            ancestor type for a derived array type.
            * sem_ch13.adb (Inherit_Aspects_At_Freeze_Point): Factor out the
            common processing done on representation items.
            For Default_Component_Value and Default_Value, look into the first
            subtype to find out the representation items.

Diff:
---
 gcc/ada/exp_tss.adb  |   5 +-
 gcc/ada/sem_ch13.adb | 205 ++++++++++++++++++++++++++++++++-------------------
 2 files changed, 133 insertions(+), 77 deletions(-)

diff --git a/gcc/ada/exp_tss.adb b/gcc/ada/exp_tss.adb
index 09bb133a41f..23ee3496b23 100644
--- a/gcc/ada/exp_tss.adb
+++ b/gcc/ada/exp_tss.adb
@@ -78,8 +78,11 @@ package body Exp_Tss is
       else
          Proc := Init_Proc (Base_Type (Full_Type), Ref);
 
+         --  For derived record types, if the base type does not have one,
+         --  we use the Init_Proc of the ancestor type.
+
          if No (Proc)
-           and then Is_Composite_Type (Full_Type)
+           and then Is_Record_Type (Full_Type)
            and then Is_Derived_Type (Full_Type)
          then
             return Init_Proc (Root_Type (Full_Type), Ref);
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 618f935e4fe..e5f0ebcd6a2 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -13493,12 +13493,68 @@ package body Sem_Ch13 is
    -------------------------------------
 
    procedure Inherit_Aspects_At_Freeze_Point (Typ : Entity_Id) is
+      function Get_Inherited_Rep_Item
+        (E   : Entity_Id;
+         Nam : Name_Id) return Node_Id;
+      --  Search the Rep_Item chain of entity E for an instance of a rep item
+      --  (pragma, attribute definition clause, or aspect specification) whose
+      --  name matches the given name Nam, and that has been inherited from its
+      --  parent, i.e. that has not been directly specified for E . If one is
+      --  found, it is returned, otherwise Empty is returned.
+
+      function Get_Inherited_Rep_Item
+        (E    : Entity_Id;
+         Nam1 : Name_Id;
+         Nam2 : Name_Id) return Node_Id;
+      --  Search the Rep_Item chain of entity E for an instance of a rep item
+      --  (pragma, attribute definition clause, or aspect specification) whose
+      --  name matches one of the given names Nam1 or Nam2, and that has been
+      --  inherited from its parent, i.e. that has not been directly specified
+      --  for E . If one is found, it is returned, otherwise Empty is returned.
+
       function Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
         (Rep_Item : Node_Id) return Boolean;
       --  This routine checks if Rep_Item is either a pragma or an aspect
       --  specification node whose corresponding pragma (if any) is present in
       --  the Rep Item chain of the entity it has been specified to.
 
+      ----------------------------
+      -- Get_Inherited_Rep_Item --
+      ----------------------------
+
+      function Get_Inherited_Rep_Item
+        (E   : Entity_Id;
+         Nam : Name_Id) return Node_Id
+      is
+         Rep : constant Node_Id
+                 := Get_Rep_Item (E, Nam, Check_Parents => True);
+      begin
+         if Present (Rep)
+           and then not Has_Rep_Item (E, Nam, Check_Parents => False)
+         then
+            return Rep;
+         else
+            return Empty;
+         end if;
+      end Get_Inherited_Rep_Item;
+
+      function Get_Inherited_Rep_Item
+        (E    : Entity_Id;
+         Nam1 : Name_Id;
+         Nam2 : Name_Id) return Node_Id
+      is
+         Rep : constant Node_Id
+                 := Get_Rep_Item (E, Nam1, Nam2, Check_Parents => True);
+      begin
+         if Present (Rep)
+           and then not Has_Rep_Item (E, Nam1, Nam2, Check_Parents => False)
+         then
+            return Rep;
+         else
+            return Empty;
+         end if;
+      end Get_Inherited_Rep_Item;
+
       --------------------------------------------------
       -- Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item --
       --------------------------------------------------
@@ -13513,6 +13569,8 @@ package body Sem_Ch13 is
            Present_In_Rep_Item (Entity (Rep_Item), Aspect_Rep_Item (Rep_Item));
       end Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item;
 
+      Rep : Node_Id;
+
    --  Start of processing for Inherit_Aspects_At_Freeze_Point
 
    begin
@@ -13543,40 +13601,36 @@ package body Sem_Ch13 is
 
       --  Ada_05/Ada_2005
 
-      if not Has_Rep_Item (Typ, Name_Ada_05, Name_Ada_2005, False)
-        and then Has_Rep_Item (Typ, Name_Ada_05, Name_Ada_2005)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Ada_05, Name_Ada_2005))
+      Rep := Get_Inherited_Rep_Item (Typ, Name_Ada_05, Name_Ada_2005);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Ada_2005_Only (Typ);
       end if;
 
       --  Ada_12/Ada_2012
 
-      if not Has_Rep_Item (Typ, Name_Ada_12, Name_Ada_2012, False)
-        and then Has_Rep_Item (Typ, Name_Ada_12, Name_Ada_2012)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Ada_12, Name_Ada_2012))
+      Rep := Get_Inherited_Rep_Item (Typ, Name_Ada_12, Name_Ada_2012);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Ada_2012_Only (Typ);
       end if;
 
       --  Ada_2022
 
-      if not Has_Rep_Item (Typ, Name_Ada_2022, False)
-        and then Has_Rep_Item (Typ, Name_Ada_2022)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Ada_2022))
+      Rep := Get_Inherited_Rep_Item (Typ, Name_Ada_2022);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Ada_2022_Only (Typ);
       end if;
 
       --  Atomic/Shared
 
-      if not Has_Rep_Item (Typ, Name_Atomic, Name_Shared, False)
-        and then Has_Rep_Pragma (Typ, Name_Atomic, Name_Shared)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Atomic, Name_Shared))
+      Rep := Get_Inherited_Rep_Item (Typ,  Name_Atomic, Name_Shared);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Atomic (Typ);
          Set_Is_Volatile (Typ);
@@ -13591,74 +13645,80 @@ package body Sem_Ch13 is
          Set_Convention (Typ, Convention (Base_Type (Typ)));
       end if;
 
-      --  Default_Component_Value
+      --  Default_Component_Value (for base types only)
 
-      --  Verify that there is no rep_item declared for the type, and there
-      --  is one coming from an ancestor.
+      --  Note that we need to look into the first subtype because the base
+      --  type may be the implicit base type built by the compiler for the
+      --  declaration of a constrained subtype with the aspect.
 
-      if Is_Array_Type (Typ)
-        and then Is_Base_Type (Typ)
-        and then not Has_Rep_Item (Typ, Name_Default_Component_Value, False)
-        and then Has_Rep_Item (Typ, Name_Default_Component_Value)
-      then
+      if Is_Array_Type (Typ) and then Is_Base_Type (Typ) then
          declare
+            F_Typ : constant Entity_Id := First_Subtype (Typ);
+
             E : Entity_Id;
 
          begin
-            E := Entity (Get_Rep_Item (Typ, Name_Default_Component_Value));
+            Rep :=
+              Get_Inherited_Rep_Item (F_Typ, Name_Default_Component_Value);
+            if Present (Rep) then
+               E := Entity (Rep);
 
-            --  Deal with private types
+               --  Deal with private types
 
-            if Is_Private_Type (E) then
-               E := Full_View (E);
-            end if;
+               if Is_Private_Type (E) then
+                  E := Full_View (E);
+               end if;
 
-            Set_Default_Aspect_Component_Value (Typ,
-              Default_Aspect_Component_Value (E));
+               Set_Default_Aspect_Component_Value
+                 (Typ, Default_Aspect_Component_Value (E));
+               Set_Has_Default_Aspect (Typ);
+            end if;
          end;
       end if;
 
-      --  Default_Value
+      --  Default_Value (for base types only)
 
-      if Is_Scalar_Type (Typ)
-        and then Is_Base_Type (Typ)
-        and then not Has_Rep_Item (Typ, Name_Default_Value, False)
-        and then Has_Rep_Item (Typ, Name_Default_Value)
-      then
-         Set_Has_Default_Aspect (Typ);
+      --  Note that we need to look into the first subtype because the base
+      --  type may be the implicit base type built by the compiler for the
+      --  declaration of a constrained subtype with the aspect.
 
+      if Is_Scalar_Type (Typ) and then Is_Base_Type (Typ) then
          declare
+            F_Typ : constant Entity_Id := First_Subtype (Typ);
+
             E : Entity_Id;
 
          begin
-            E := Entity (Get_Rep_Item (Typ, Name_Default_Value));
+            Rep := Get_Inherited_Rep_Item (F_Typ, Name_Default_Value);
+            if Present (Rep) then
+               E := Entity (Rep);
 
-            --  Deal with private types
+               --  Deal with private types
 
-            if Is_Private_Type (E) then
-               E := Full_View (E);
-            end if;
+               if Is_Private_Type (E) then
+                  E := Full_View (E);
+               end if;
 
-            Set_Default_Aspect_Value (Typ, Default_Aspect_Value (E));
+               Set_Default_Aspect_Value (Typ, Default_Aspect_Value (E));
+               Set_Has_Default_Aspect (Typ);
+            end if;
          end;
       end if;
 
       --  Discard_Names
 
-      if not Has_Rep_Item (Typ, Name_Discard_Names, False)
-        and then Has_Rep_Item (Typ, Name_Discard_Names)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Discard_Names))
+      Rep := Get_Inherited_Rep_Item (Typ, Name_Discard_Names);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Discard_Names (Typ);
       end if;
 
       --  Volatile
 
-      if not Has_Rep_Item (Typ, Name_Volatile, False)
-        and then Has_Rep_Item (Typ, Name_Volatile)
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Volatile))
+      Rep := Get_Inherited_Rep_Item (Typ, Name_Volatile);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Volatile (Typ);
          Set_Treat_As_Volatile (Typ);
@@ -13666,12 +13726,10 @@ package body Sem_Ch13 is
 
       --  Volatile_Full_Access and Full_Access_Only
 
-      if not Has_Rep_Item (Typ, Name_Volatile_Full_Access, False)
-        and then not Has_Rep_Item (Typ, Name_Full_Access_Only, False)
-        and then (Has_Rep_Item (Typ, Name_Volatile_Full_Access)
-                    or else Has_Rep_Item (Typ, Name_Full_Access_Only))
-        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Volatile_Full_Access))
+      Rep := Get_Inherited_Rep_Item
+               (Typ, Name_Volatile_Full_Access, Name_Full_Access_Only);
+      if Present (Rep)
+        and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
       then
          Set_Is_Volatile_Full_Access (Typ);
          Set_Is_Volatile (Typ);
@@ -13688,38 +13746,34 @@ package body Sem_Ch13 is
          begin
             --  Atomic_Components
 
-            if not Has_Rep_Item (Typ, Name_Atomic_Components, False)
-              and then Has_Rep_Item (Typ, Name_Atomic_Components)
-              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Atomic_Components))
+            Rep := Get_Inherited_Rep_Item (Typ, Name_Atomic_Components);
+            if Present (Rep)
+              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
             then
                Set_Has_Atomic_Components (Imp_Bas_Typ);
             end if;
 
             --  Volatile_Components
 
-            if not Has_Rep_Item (Typ, Name_Volatile_Components, False)
-              and then Has_Rep_Item (Typ, Name_Volatile_Components)
-              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Volatile_Components))
+            Rep := Get_Inherited_Rep_Item (Typ, Name_Volatile_Components);
+            if Present (Rep)
+              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
             then
                Set_Has_Volatile_Components (Imp_Bas_Typ);
             end if;
 
             --  Finalize_Storage_Only
 
-            if not Has_Rep_Pragma (Typ, Name_Finalize_Storage_Only, False)
-              and then Has_Rep_Pragma (Typ, Name_Finalize_Storage_Only)
-            then
+            Rep := Get_Inherited_Rep_Item (Typ, Name_Finalize_Storage_Only);
+            if Present (Rep) then
                Set_Finalize_Storage_Only (Bas_Typ);
             end if;
 
             --  Universal_Aliasing
 
-            if not Has_Rep_Item (Typ, Name_Universal_Aliasing, False)
-              and then Has_Rep_Item (Typ, Name_Universal_Aliasing)
-              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item
-                   (Get_Rep_Item (Typ, Name_Universal_Aliasing))
+            Rep := Get_Inherited_Rep_Item (Typ, Name_Universal_Aliasing);
+            if Present (Rep)
+              and then Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item (Rep)
             then
                Set_Universal_Aliasing (Imp_Bas_Typ);
             end if;
@@ -13727,9 +13781,8 @@ package body Sem_Ch13 is
             --  Bit_Order
 
             if Is_Record_Type (Typ) and then Typ = Bas_Typ then
-               if not Has_Rep_Item (Typ, Name_Bit_Order, False)
-                 and then Has_Rep_Item (Typ, Name_Bit_Order)
-               then
+               Rep := Get_Inherited_Rep_Item (Typ, Name_Bit_Order);
+               if Present (Rep) then
                   Set_Reverse_Bit_Order (Bas_Typ,
                     Reverse_Bit_Order
                       (Implementation_Base_Type (Etype (Bas_Typ))));

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-01-03  9:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-03  9:33 [gcc r13-4958] ada: Fix support of Default_Component_Value aspect on derived types Marc Poulhi?s

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).