[Ada] Default 'Input for array of limited object
Arnaud Charlet
charlet@adacore.com
Wed Aug 3 10:50:00 GMT 2011
This change fixes a bug in the generation of the default implementation
of the 'Input stream attribute in Ada 2005 mode for the case of an
unconstrained array of limited objects with a 'Read attribute. The following
compilation must be accepted quietly:
$ gcc -c -gnat05 unc_lim_input.adb
with Ada.Streams; use Ada.Streams;
package Limited_Remote is
pragma Remote_Types;
type T is tagged limited private;
type A is array (Integer range <>) of T;
procedure R (S : access Root_Stream_Type'Class; V : out A);
for A'Read use R;
procedure W (S : access Root_Stream_Type'Class; V : A);
for A'Write use W;
private
type T is tagged limited null record;
end Limited_Remote;
with Ada.Streams; use Ada.Streams;
with Limited_Remote;
procedure Unc_Lim_Input (S : access Root_Stream_Type'Class) is
procedure Do_Stuff (X : Limited_Remote.A) is begin null; end;
begin
Do_Stuff (Limited_Remote.A'Input (S));
end Unc_Lim_Input;
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-08-03 Thomas Quinot <quinot@adacore.com>
* exp_strm.adb (Build_Array_Input_Function): In Ada 2005 mode, when
returning a limited array, use an extended return statement.
-------------- next part --------------
Index: exp_strm.adb
===================================================================
--- exp_strm.adb (revision 177026)
+++ exp_strm.adb (working copy)
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -149,7 +149,9 @@
Decls : List_Id;
Ranges : List_Id;
Stms : List_Id;
+ Rstmt : Node_Id;
Indx : Node_Id;
+ Odecl : Node_Id;
begin
Decls := New_List;
@@ -197,13 +199,13 @@
-- build a subtype indication with the proper bounds.
if Is_Constrained (Stream_Base_Type (Typ)) then
- Append_To (Decls,
+ Odecl :=
Make_Object_Declaration (Loc,
Defining_Identifier => Make_Defining_Identifier (Loc, Name_V),
Object_Definition =>
- New_Occurrence_Of (Stream_Base_Type (Typ), Loc)));
+ New_Occurrence_Of (Stream_Base_Type (Typ), Loc));
else
- Append_To (Decls,
+ Odecl :=
Make_Object_Declaration (Loc,
Defining_Identifier => Make_Defining_Identifier (Loc, Name_V),
Object_Definition =>
@@ -212,20 +214,35 @@
New_Occurrence_Of (Stream_Base_Type (Typ), Loc),
Constraint =>
Make_Index_Or_Discriminant_Constraint (Loc,
- Constraints => Ranges))));
+ Constraints => Ranges)));
end if;
- Stms := New_List (
- Make_Attribute_Reference (Loc,
- Prefix => New_Occurrence_Of (Typ, Loc),
- Attribute_Name => Name_Read,
- Expressions => New_List (
- Make_Identifier (Loc, Name_S),
- Make_Identifier (Loc, Name_V))),
+ Rstmt := Make_Attribute_Reference (Loc,
+ Prefix => New_Occurrence_Of (Typ, Loc),
+ Attribute_Name => Name_Read,
+ Expressions => New_List (
+ Make_Identifier (Loc, Name_S),
+ Make_Identifier (Loc, Name_V)));
- Make_Simple_Return_Statement (Loc,
- Expression => Make_Identifier (Loc, Name_V)));
+ if Ada_Version >= Ada_2005 then
+ Stms := New_List (
+ Make_Extended_Return_Statement (Loc,
+ Return_Object_Declarations => New_List (Odecl),
+ Handled_Statement_Sequence =>
+ Make_Handled_Sequence_Of_Statements (Loc,
+ New_List (Rstmt))));
+ else
+ -- pragma Assert (not Is_Limited_Type (Typ));
+ -- Returning a local object, shouldn't happen in the case of a
+ -- limited type, but currently occurs in DSA stubs in Ada 95 mode???
+ Stms := New_List (
+ Odecl,
+ Rstmt,
+ Make_Simple_Return_Statement (Loc,
+ Expression => Make_Identifier (Loc, Name_V)));
+ end if;
+
Fnam :=
Make_Defining_Identifier (Loc,
Chars => Make_TSS_Name_Local (Typ, TSS_Stream_Input));
More information about the Gcc-patches
mailing list