This fixes an ICE on the instantiation of a generic package taking an 
unconstrained array type declared with a predicate as generic actual 
parameter.

Tested on x86_64-suse-linux, applied on the mainline.


2019-10-11  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/decl.c (Gigi_Equivalent_Type) <E_Array_Subtype>: New
        case.  Return the base type if the subtype is not constrained.


2019-10-11  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/array38.adb: New test.
        * gnat.dg/array38_pkg.ad[sb]: New helper.

-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 276864)
+++ gcc-interface/decl.c	(working copy)
@@ -5026,6 +5026,11 @@ Gigi_Equivalent_Type (Entity_Id gnat_ent
       gnat_equiv = Etype (gnat_entity);
       break;
 
+    case E_Array_Subtype:
+      if (!Is_Constrained (gnat_entity))
+	gnat_equiv = Etype (gnat_entity);
+      break;
+
     case E_Class_Wide_Type:
       gnat_equiv = Root_Type (gnat_entity);
       break;
-- { dg-do compile }

with Array38_Pkg; use Array38_Pkg;

procedure Array38 is

  function My_F is new F (Index, Byte, Bytes, Integer);

begin
  null;
end;
package Array38_Pkg is

   type Byte is mod 2**8;

   type Length is new Natural;
   subtype Index is Length range 1 .. Length'Last;

   type Bytes is array (Index range <>) of Byte with
     Predicate => Bytes'Length > 0;

   generic
      type Index_Type   is (<>);
      type Element_Type is (<>);
      type Array_Type   is array (Index_Type range <>) of Element_Type;
      type Value_Type   is (<>);
   function F (Data : Array_Type) return Value_Type;

end Array38_Pkg;
package body Array38_Pkg is

   function F (Data : Array_Type) return Value_Type is
   begin
      return Value_Type'First;
   end;

end Array38_Pkg;

Reply via email to