This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Tested on i686-linux, committed on trunk
This patch implements handling of record types in the new routine to
write output Itype values. There are two cases, with and without an
explicitly built declaration. Both are now handled.
A test program is:
with Ada.Text_IO; use Ada.Text_IO;
package body Pak2 is
function F (Whence : Day) return Pak1.Ptr is
begin
return new Derived_Data'(Whence => Whence, X => 123);
end F;
X : Pak1.Ptr;
Y : aliased Derived_Data := (Whence => Sun, X => 456);
begin
Put_Line ("From function return:");
X := F (Wed);
if X.Kind'Valid then
Put_Line ("X.Kind = " & X.Kind'Img);
else
Put_Line ("X.Kind has invalid representation");
end if;
Put_Line ("From aliased initialized object:");
X := Y'Access;
if X.Kind'Valid then
Put_Line ("X.Kind = " & X.Kind'Img);
else
Put_Line ("X.Kind has invalid representation");
end if;
end Pak2;
This patch also implements an enhancement to the output of reconstructed
expanded source listings (-gnatD/G switch output). This output now
includes a representation of itypes (internally generated types for
which no type declaration is present in the tree). A test program is
procedure Q is
R : String (1 .. 10);
type H is new String (1 .. 10);
type HH is access H;
HHH : HH;
begin
R (1 .. 5) := R (6 .. 10);
HHH := new H'("Abcdeabcde");
end;
which, compiled with -gnatG -gnatws, generates:
Source recreated from tree for Q (body)
---------------------------------------
procedure q is
subtype q__TrS is string (1 .. 10);
r : string (1 .. 10);
[type q__ThB is array (positive range <>) of character]
subtype q__h is q__ThB (1 .. 10);
type q__hh is access q__h;
hhh : q__hh := null;
begin
r ({1 .. 5}) := r ({6 .. 10});
hhh := new q__h'("Abcdeabcde");
return;
end q;
Here the line listing q__ThB is the new output
Protected types that have interface progenitors are tagged types, but
they are not limited records, so a separate check must be made to allow
private components that are themselves limited.
the following must compile quietly:
gcc -c -gnatc -gnat05 p-c.ads
--
package P is
type Timer is synchronized interface;
procedure Await_Alarm (This : in out Timer) is abstract;
end P;
--
package P.C is
type L is limited null record;
protected type Alarm is new Timer with
overriding entry Await_Alarm;
private
X : L; -- compiler complains about this decl
end Alarm;
end P.C;
If the parent of the full-view is an interface we perform a transformation
of the tree to ensure that it has the same parent than the partial-view.
This work is needed because the list of interfaces of the full-view can
be given in any order. After this change the following test must compile
without errors:
--
procedure do_test is
package Pkg is
type A is interface;
type B is interface and A;
type D is new B with private;
private
type D is new A and B with null record;
end Pkg;
--
begin
null;
end do_test;
2005-12-05 Robert Dewar <dewar@adacore.com>
Ed Schonberg <schonberg@adacore.com>
Gary Dismukes <dismukes@adacore.com>
Javier Miranda <miranda@adacore.com>
Hristian Kirtchev <kirtchev@adacore.com>
* einfo.adb (Itype_Printed): New flag
(Is_Limited_Type): Derived types do not inherit limitedness from
interface progenitors.
(Is_Return_By_Reference_Type): Predicate does not apply to limited
interfaces.
* einfo.ads (Itype_Printed): New flag
Move Is_Wrapper_Package to proper section
Add missing Inline for Is_Volatile
* output.ads, output.adb (Write_Erase_Char): New procedure
(Save/Restore_Output_Buffer): New procedures
(Save/Restore_Output_Buffer): New procedures
* sprint.ads, sprint.adb (Write_Itype): Handle case of record itypes
Add missing support for anonymous access type
(Write_Id): Insert calls to Write_Itype
(Write_Itype): New procedure to output itypes
* par-ch12.adb (P_Formal_Derived_Type_Definition): In Ada 2005, handle
use of "limited" in declaration.
* sinfo.ads, sinfo.adb:
Formal derived types can carry an explicit "limited" indication.
* sem_ch3.adb: Add with and use of Targparm.
(Create_Component): If Frontend_Layout_On_Target is True and the
copied component does not have a known static Esize, then reset
the size and positional fields of the new component.
(Analyze_Component_Declaration): A limited component is
legal within a protected type that implements an interface.
(Collect_Interfaces): Do not add to the list the interfaces that
are implemented by the ancestors.
(Derived_Type_Declaration): If the parent of the full-view is an
interface perform a transformation of the tree to ensure that it has
the same parent than the partial-view. This simplifies the job of the
expander in order to generate the correct object layout, and it is
needed because the list of interfaces of the full-view can be given in
any order.
(Process_Full_View): The parent of the full-view does not need to be
a descendant of the parent of the partial view if both parents are
interfaces.
(Analyze_Private_Extension_Declaration): If declaration has an explicit
"limited" the parent must be a limited type.
(Build_Derived_Record_Type): A derived type that is explicitly limited
must have limited ancestor and progenitors.
(Build_Derived_Type): Ditto.
(Process_Full_View): Verify that explicit uses of "limited" in partial
and full declarations are consistent.
(Find_Ancestor_Interface): Remove function.
(Collect_Implemented_Interfaces): New procedure used to gather all
implemented interfaces by a type.
(Contain_Interface): New function used to check whether an interface is
present in a list.
(Find_Hidden_Interface): New function used to determine whether two
lists of interfaces constitute a set equality. If not, the first
differing interface is returned.
(Process_Full_View): Improve the check for the "no hidden interface"
rule as defined by AI-396.
Attachment:
difs.15
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |