[comp.lang.ada] differed private declarations

scott@shuksan.UUCP (Scott Moody) (01/24/88)

I was fighting a compiler bug yesterday which I thought interesting,
and didn't even know it was possible in ada.

Try:

   -------------------------------------------------
   package test_private is
      type handle is limited private;
      type fruit is (apple,orange);
      procedure create_fruit(kind:fruit; result: OUT handle);
   private
      type handle_record(kind:fruit);
      type handle is access handle;
      ---
      -- Differ the actual definition of handle_record until
      -- body of package  (say this in Ada Rational)
      --
   end test_private;

   package body test_private is
      type handle_record(kind:fruit) is
	 record
	     field1:integer;
	     case kind is
		when apple =>  color:integer;
		when orange => skin_thickness:integer;
			       where_from    :string(1..100);
	     end case;
	 end record;
      procedure create_fruit(kind:fruit; result: OUT handle) is
	r : handle;
      begin
	r := new handle_record(kind);
	case kind is
		when apple  =>  r.color:= 101;
		when orange =>  r.skin_thickness:= 11;
	end case;
	return r;
      end create_fruit;
   end test_private;

   -------------------------------------------------
It turns out that if the private type is a pointer (access) variable
then the definition of what it points to can be differed until
the body of the package.

Unfortunately the compiler decided that every  "new handle_record(kind)"
translated into fruit'first   instead of the one desired.
(Actually the enumeration was a subtype or a larger enumeration, 
and don't know if that matters?)

Finally had to put the type definition back in the private part.
---------------

This is using the verdix compiler v5.41.  Anyone care to try it on their
compiler?

--thanks

scott moody @ boeing mountain network