comp.lang.ada
 help / color / mirror / Atom feed
* Return_By_Reference or Return_By_Copy (GNAT bug?)
@ 2004-12-31 11:07 Duncan Sands
  2004-12-31 21:32 ` Randy Brukardt
  0 siblings, 1 reply; 9+ messages in thread
From: Duncan Sands @ 2004-12-31 11:07 UTC (permalink / raw)
  To: comp.lang.ada

Consider the following version of the Rosen trick.  Should
A_Type be returned by reference or by copy?  GNAT 3.15p says:
by reference; more recent versions of GNAT say: by copy.  My
understanding is that it should be by reference, because it
has a component R_Type that is a return_by_reference type
(R_Type is return_by_reference because the full view is limited
private).

GNAT 3.15p gives the expected output:

Mechanism: 2 <= GNAT specific, means return_by_reference

 0
 1

 1
 2


gcc at the pre-ssa tag gives:

Mechanism: 1 <= GNAT specific, means return_by_copy

 0
 0

 1
 1

Before reporting this bug I would like to be sure that it is one.
Language lawyers, please step forwards!

Thanks a lot,

Duncan.


-- B spec --

package B is

   type A_Type is limited private;

   function Get_The_A return A_Type;

   procedure Increment (An_A : A_Type);

   procedure Print (An_A : A_Type);

private

   type R_Type (An_A : access A_Type) is limited null record;

   type A_Type is record
      R : R_Type (A_Type'Access);
      I : Integer := 0;
   end record;

end;


-- B body --

with Ada.Text_IO; use Ada.Text_IO;

package body B is

   The_A : A_Type;

   function Get_The_A return A_Type is
   begin
      return The_A;
   end;

   procedure Increment (An_A : A_Type) is
   begin
      An_A.R.An_A.I := An_A.R.An_A.I + 1;
   end;

   procedure Print (An_A : A_Type) is
   begin
      Put_Line (An_A.I'Img);
   end;

end;


-- X --

with Ada.Text_IO; use Ada.Text_IO;
with B; use B;

procedure X is

   procedure Look is
      The_A_Reference : A_Type renames Get_The_A;
   begin
      Print (The_A_Reference);
      Increment (The_A_Reference);
      Print (The_A_Reference);
   end;

begin
   Put_Line ("Mechanism:" & Integer'Image (Get_The_A'Mechanism_Code)); -- GNAT specific attribute, 1 = by_copy, 2 = by_reference
   New_Line;
   Look;
   New_Line;
   Look;
end;



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2005-03-08 16:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-31 11:07 Return_By_Reference or Return_By_Copy (GNAT bug?) Duncan Sands
2004-12-31 21:32 ` Randy Brukardt
2005-01-01 22:00   ` Duncan Sands
2005-01-03 23:11     ` Randy Brukardt
2005-01-04  4:20       ` Larry Kilgallen
2005-01-04 23:27         ` Randy Brukardt
2005-01-08 13:06       ` Duncan Sands
2005-01-10 21:05         ` Randy Brukardt
2005-03-08 16:12           ` Duncan Sands

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