comp.lang.ada
 help / color / mirror / Atom feed
From: mockturtle <framefritti@gmail.com>
Subject: Strange compile-time error  with Ada.Containers.Indefinite_Hashed_Maps
Date: Mon, 19 May 2014 03:10:07 -0700 (PDT)
Date: 2014-05-19T03:10:07-07:00	[thread overview]
Message-ID: <9d912199-ff00-403f-b6e3-fb9632ec145e@googlegroups.com> (raw)

Dear all,
I am stuck with an error that could be a compiler bug and I hope you could give me some help.  I am currently using GNAT 20140331 on 64 bit Linux.

A brief introduction about what I am trying to do: I want to implement a "symbol table" that maps identifiers (implemented as bounded strings) into "symbol descriptors" (implemented as records with a discriminant that identifies the symbol type).  

I define the "identifier name" type in a package that is with-ed by the package that defines the symbol table.  The symbol table is just a Indefinite_Hash_Map (indefinite since the descriptor is indefinite).   When I try to compile the body of the symbol table package I get in the .ads the error 

    instantiation error at a-cihama.adb:1043
    invalid constraint: type has no discriminant

I was able to replicate the error with a small set of files.  At the end of this message you will find three packages: Ginger (that defines the identifier type), Foo (that with-s Ginger) and Foo_2 (that is Foo merged together with Ginger, so that it is self-sufficient).

If I try to compile foo.adb, I get the error above; if I try to compile foo-2.adb, I get no error.  This makes me suspect that (i) I tripped over some subtlety of the language or (ii) this is a bug.

Any help?

Thank you.

Riccardo

---------

--------------------
--   GINGER.ADS   --
--------------------

with Ada.Strings.Bounded;

package ginger is
   type Name_Type is private;

   function To_String(X:Name_Type) return String;

private
   package Names is
     new Ada.Strings.Bounded.Generic_Bounded_Length (10);

   type Name_Type is new Names.Bounded_String;

   function To_String (X : Name_Type) return String
   is (Names.To_String (Names.Bounded_String (X)));
end ginger;

-----------------
--   FOO.ADS   --
-----------------


with Ada.Containers.Indefinite_Hashed_Maps;
with Ada.Strings.Hash;
with Ginger;

package foo is
   type My_Map is tagged private;

   type Name_Class is (First, Second);

   type Descriptor (Class : Name_Class) is
      record
         case Class is
            when First =>
               null;

            when Second =>
               X : Float;
         end case;
      end record;

   procedure Zizi (X: My_Map);

private
   function Hash (Key : Ginger.Name_Type) return Ada.Containers.Hash_Type;

   function Equal (Left, Right : Ginger.Name_Type) return Boolean;

   package Maps is
     new Ada.Containers.Indefinite_Hashed_Maps
       (Key_Type        => Ginger.Name_Type,
        Element_Type    => Descriptor,
        Hash            => Hash,
        Equivalent_Keys => Equal);

   type My_Map is  new Maps.Map with null record;
end foo;

-----------------
--   FOO.ADB   --
-----------------

package body foo is

   ----------
   -- Zizi --
   ----------

   procedure Zizi (X: My_Map) is
   begin
      null;
   end Zizi;
   
   function Hash (Key : Ginger.Name_Type) return Ada.Containers.Hash_Type
   is
   begin
      return Ada.Strings.Hash (Ginger.To_String (Key));
   end Hash;

   function Equal (Left, Right : Ginger.Name_Type) return Boolean 
   is
   begin
      
      return Ginger.To_String (Left) = Ginger.To_String (Right);
   end Equal;
        


end foo;

-------------------
--   FOO_2.ADS   --
-------------------


with Ada.Containers.Indefinite_Hashed_Maps;
with Ada.Strings.Hash;
with Ada.Strings.Bounded;


package Foo_2 is
   type My_Map is tagged private;

   type Name_Class is (First, Second);

   type Descriptor (Class : Name_Class) is
      record
         case Class is
            when First =>
               null;

            when Second =>
               X : Float;
         end case;
      end record;

   procedure Zizi (X: My_Map);

private
   package Names is
     new Ada.Strings.Bounded.Generic_Bounded_Length (10);

   type Name_Type is new Names.Bounded_String;

   function To_String (X : Name_Type) return String
   is (Names.To_String (Names.Bounded_String (X)));

   function Hash (Key : Name_Type) return Ada.Containers.Hash_Type
   is (Ada.Strings.Hash (To_String (Key)));

   function Equal (Left, Right : Name_Type) return Boolean
   is (Left = Right);

   package Maps is
     new Ada.Containers.Indefinite_Hashed_Maps
       (Key_Type        => Name_Type,
        Element_Type    => Descriptor,
        Hash            => Hash,
        Equivalent_Keys => Equal);

   type My_Map is tagged
      record
         M : Maps.Map;
      end record;
end Foo_2;


-------------------
--   FOO_2.ADB   --
-------------------

package body Foo_2 is

   ----------
   -- Zizi --
   ----------

   procedure Zizi (X: My_Map) is
   begin
      null;
   end Zizi;

end Foo_2;


             reply	other threads:[~2014-05-19 10:10 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-19 10:10 mockturtle [this message]
2014-05-19 13:49 ` Strange compile-time error with Ada.Containers.Indefinite_Hashed_Maps Simon Wright
2014-05-19 16:00   ` mockturtle
2014-05-19 16:19     ` G.B.
2014-05-19 16:35     ` Simon Wright
2014-05-19 21:27     ` J-P. Rosen
2014-05-20  6:30       ` Simon Wright
2014-05-20 20:47       ` björn lundin
2014-05-21  5:04         ` J-P. Rosen
2014-05-25 18:28           ` björn lundin
2014-05-26  8:53             ` J-P. Rosen
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox