This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Fix internal error on renaming of equality for record type


This adjusts the previous change to the cases where the array type is not
yet frozen and, therefore, where Size_Depends_On_Discriminant is not yet
computed, by doing the computation manually.

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

2018-05-28  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_ch4.adb (Expand_Composite_Equality): Compute whether the size
	depends on a discriminant manually instead of using the predicate
	Size_Depends_On_Discriminant in the array type case.

gcc/testsuite/

	* gnat.dg/renaming12.adb, gnat.dg/renaming12.ads: New testcase.
--- gcc/ada/exp_ch4.adb
+++ gcc/ada/exp_ch4.adb
@@ -2435,6 +2435,10 @@ package body Exp_Ch4 is
          else
             declare
                Comp_Typ : Entity_Id;
+               Indx     : Node_Id;
+               Ityp     : Entity_Id;
+               Lo       : Node_Id;
+               Hi       : Node_Id;
 
             begin
                --  Do the comparison in the type (or its full view) and not in
@@ -2450,9 +2454,25 @@ package body Exp_Ch4 is
                --  Except for the case where the bounds of the type depend on a
                --  discriminant, or else we would run into scoping issues.
 
-               if Size_Depends_On_Discriminant (Comp_Typ) then
-                  Comp_Typ := Full_Type;
-               end if;
+               Indx := First_Index (Comp_Typ);
+               while Present (Indx) loop
+                  Ityp := Etype (Indx);
+
+                  Lo := Type_Low_Bound (Ityp);
+                  Hi := Type_High_Bound (Ityp);
+
+                  if (Nkind (Lo) = N_Identifier
+                       and then Ekind (Entity (Lo)) = E_Discriminant)
+                    or else
+                     (Nkind (Hi) = N_Identifier
+                       and then Ekind (Entity (Hi)) = E_Discriminant)
+                  then
+                     Comp_Typ := Full_Type;
+                     exit;
+                  end if;
+
+                  Next_Index (Indx);
+               end loop;
 
                return Expand_Array_Equality (Nod, Lhs, Rhs, Bodies, Comp_Typ);
             end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/renaming12.adb
@@ -0,0 +1,7 @@
+--  { dg-do compile }
+
+package body Renaming12 is
+
+  procedure Dummy is null;
+
+end Renaming12;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/renaming12.ads
@@ -0,0 +1,23 @@
+package Renaming12 is
+
+  type Index_Type is range 0 .. 40;
+
+  type Rec1 is record
+    B : Boolean;
+  end record;
+
+  type Arr is array (Index_Type range <>) of Rec1;
+
+  type Rec2 (Count : Index_Type := 0) is record
+    A : Arr (1 .. Count);
+  end record;
+
+  package Ops is
+
+    function "=" (L : Rec2; R : Rec2) return Boolean renames Renaming12."=";
+
+  end Ops;
+
+  procedure Dummy;
+
+end Renaming12;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]