Randy and Tuck,

first of all, I have to apologize for pestering you with this mail. It was never meant to be sent. I wrote it with the intention to send it and collected the RM paragraphs, but the more I did I saw that I wasn't ready. So I wanted to quit and pressed the wrong button.

I thought about immediately sending a second mail saying "please ignore" - but then: what I writ I writ!

So I made a long pause before I now come back to this. Apology again for answering so late. And thank you for your patience.

/Randy: How do YOU want this to work?? Explain your answer./

In effect, I had expected something like what GNAT did, a kind of aggregate, but without the discriminants that do not occur in an aggregate. So I tried to understand what the RM has to say... (not a moderate task)

I've read the complete AIs about the new Image. (There is a remark that perhaps later a matching Value could be defined. I guess this idea has been dropped. How could this be done with Image having components not available in the aggregate.)

I readRM 4.10(7/5) that the parent image should be given, which GNAT did not do (CE 2021; perhaps this has changed meanwhile) because it used the actual discriminant names.[This is not a bug report.]

I see there are conflicting aims: Using extension aggregates when Put_Image is defined for an ancestor (which might have different discriminants), else using the actual names. I gather that Tuck feels some sympathy for using actual names!

So in effect the current solution for untagged records looks OK (replacing discrimininants instead of inheriting them seems like nonsense).

*What I do not understand is RM 4.10(17/5, 18/5) talking about the default implementation of T'Write. T'Write does not include discriminants except when they have defaults, which they do not have here*(yet GNAT outputs them)*. An image without discriminants seems like utter nonsense to me *- which is what GNAT creates for Image with tagged derived types under certain conditions*! Is this really the intention? See below:
*

-----------------------

with Ada.Text_IO;
use Ada.Text_IO;

with Interfaces;
use Interfaces;

procedure Sequence is

  type T0 (D0: Integer_8) is tagged record
    K0: Integer_8;
  end record;

  type T1 is new T0 (D0 => -1) with record
    K1: Integer_8;
  end record;

  procedure P0 is
    -- D0  K0
    X: T0 := ( 1, -1);
   begin
    Put_Line ("P0");
    Put_Line ("==");
    Put_Line (X'Image);
    New_Line;
  end P0;

  procedure P1 is
    -- D0  K0 K1
    X: T1 := (-1, -2, 8);  -- D0 must be -1
  begin
    Put_Line ("P1");
    Put_Line ("==");
    Put_Line (X'Image);
    New_Line;
  end P1;

begin

  P0;
  P1;

end Sequence;

-----------------------

P0
==

(D0 =>  1,
 K0 => -1)

P1
==

(K0 => -2,
 K1 =>  8)

Reply via email to