[Ada] Avoid warnings regarding rep clauses in generics

Message ID 20211110085845.GA2811200@adacore.com
State Committed
Headers
Series [Ada] Avoid warnings regarding rep clauses in generics |

Commit Message

Pierre-Marie de Rodat Nov. 10, 2021, 8:58 a.m. UTC
  Representation-related node fields are not set for types in generic
units, so we should not warn based on the values of such fields. Also
avoid printing the values of such fields for -gnatR.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* repinfo.adb (List_Common_Type_Info, List_Object_Info): Add
	check for In_Generic_Scope.
	(List_Component_Layout): Check for known static values.
	* sem_ch13.adb (Check_Record_Representation_Clause): Add check
	for In_Generic_Scope.
  

Patch

diff --git a/gcc/ada/repinfo.adb b/gcc/ada/repinfo.adb
--- a/gcc/ada/repinfo.adb
+++ b/gcc/ada/repinfo.adb
@@ -38,6 +38,7 @@  with Output;         use Output;
 with Osint.C;        use Osint.C;
 with Sem_Aux;        use Sem_Aux;
 with Sem_Eval;       use Sem_Eval;
+with Sem_Util;
 with Sinfo;          use Sinfo;
 with Sinfo.Nodes;    use Sinfo.Nodes;
 with Sinfo.Utils;    use Sinfo.Utils;
@@ -426,11 +427,14 @@  package body Repinfo is
          end if;
 
       --  Alignment is not always set for task, protected, and class-wide
-      --  types.
+      --  types. Representation aspects are not computed for types in a
+      --  generic unit.
 
       else
          pragma Assert
-           (Is_Concurrent_Type (Ent) or else Is_Class_Wide_Type (Ent));
+           (Is_Concurrent_Type (Ent) or else
+              Is_Class_Wide_Type (Ent) or else
+              Sem_Util.In_Generic_Scope (Ent));
       end if;
    end List_Common_Type_Info;
 
@@ -902,6 +906,13 @@  package body Repinfo is
 
    procedure List_Object_Info (Ent : Entity_Id) is
    begin
+      --  The information has not been computed in a generic unit, so don't try
+      --  to print it.
+
+      if Sem_Util.In_Generic_Scope (Ent) then
+         return;
+      end if;
+
       Write_Separator;
 
       if List_Representation_Info_To_JSON then
@@ -1176,13 +1187,17 @@  package body Repinfo is
             Write_Str (" range  ");
          end if;
 
-         Sbit := Starting_First_Bit + Fbit;
+         if Known_Static_Normalized_First_Bit (Ent) then
+            Sbit := Starting_First_Bit + Fbit;
 
-         if Sbit >= SSU then
-            Sbit := Sbit - SSU;
-         end if;
+            if Sbit >= SSU then
+               Sbit := Sbit - SSU;
+            end if;
 
-         UI_Write (Sbit, Decimal);
+            UI_Write (Sbit, Decimal);
+         else
+            Write_Unknown_Val;
+         end if;
 
          if List_Representation_Info_To_JSON then
             Write_Line (", ");


diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -12618,9 +12618,11 @@  package body Sem_Ch13 is
       end if;
 
       --  Skip the following warnings if overlap was detected; programmer
-      --  should fix the errors first.
+      --  should fix the errors first. Also skip the warnings for types in
+      --  generics, because their representation information is not fully
+      --  computed.
 
-      if not Overlap_Detected then
+      if not Overlap_Detected and then not In_Generic_Scope (Rectype) then
          --  Check for record holes (gaps)
 
          if Warn_On_Record_Holes then