[Bug ada/19220] New: Return-by-reference type wrongly considered return-by-copy (regression)
baldrick at free dot fr
gcc-bugzilla@gcc.gnu.org
Sat Jan 1 22:13:00 GMT 2005
gcc from current CVS, and also at the pre-ssa tag, both generate wrong code
for the following example (a version of the Rosen trick). The basic problem
seems to be that A_Type is returned by copy even though it is a
return-by-reference type (it has a component, R, which is a return-by-reference
type; R is a return-by-reference type because the full view is limited
private). GNAT 3.15p produces the following correct result:
./x
Mechanism: 2
0
1
1
2
Recent versions of gcc produce the following wrong result:
./x
Mechanism: 1
0
0
1
1
---chop here---
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;
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;
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));
New_Line;
Look;
New_Line;
Look;
end;
--
Summary: Return-by-reference type wrongly considered return-by-
copy (regression)
Product: gcc
Version: tree-ssa
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ada
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: baldrick at free dot fr
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19220
More information about the Gcc-bugs
mailing list