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]

[Ada] Fix bug in front-end layout


Tested on i686-linux, committed on mainline.

This was a set of problems with generation of size functions by the front
end's type layout algorithms (currently only used by the non-GCC-based
GNAAMP compiler). The initial symptom was an assertion failure in
Install_Visible_Decls, which was being passed a private type. The idiom
causing this was a private type whose full type contained a discriminant-
dependent array component). The fix for that specific blowup was to check
Underlying_Type of an array's parent scope when determining the insertion
type in Layout_Array_Type. The assertion failure turned out to be masking
a more fundamental problem, namely that the V formals in various size
functions generated for a discriminated private type were being given
inconsistent type views (private vs. full entity). That resulted in
type mismatches when analyzing certain size functions, depending on
when the type was frozen.
The following test should compile silently with -gnatdF -gnatws -gnatc:
--
procedure FE_Layout_Bugs is
   subtype Subint is Integer range 0 .. 100;
   package Pkg is
      type Rec (D : Subint := 10) is private;
   private
      type Rec (D : Subint := 10) is record
         S : String (1 .. D);
      end record;
   end Pkg;
   R1 : Pkg.Rec;      -- Assert_Failure with GNAAMP (or with FE layout on)
   R2 : Pkg.Rec (10); -- Causes type mismatch errors after fix for A_F
   R3 : Pkg.Rec (7);
   package body Pkg is
      P1 : Pkg.Rec (10);
      P2 : Pkg.Rec;
   end Pkg;
begin
   null;
end FE_Layout_Bugs;

2005-06-14  Gary Dismukes  <dismukes@adacore.com>

	* layout.adb (Discrimify): Remove resetting of Vtype to the underlying
	type which turns out to be an incomplete and incorrect fix.
	(Layout_Array_Type): Use Underlying_Type when checking whether the scope
	of the type is declared in a record (for determination of insertion
	type).
	(SO_Ref_From_Expr): Test whether Vtype denotes a partial or full view of
	a private type and ensure that the primary entity is used for the type
	of the newly created function's V formal by taking the Etype of the
	view.

Attachment: difs.33
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]