summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-16 08:42:04 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-16 08:42:04 +0000
commitc2258dde077e21a163aac81d797ee0f9284ba056 (patch)
tree458b4c68b0da5ede00eaa37fd4ee5736a5c61615 /gcc
parentad6d735e79dd7f48d0100bba36828e9d73735303 (diff)
downloadgcc-c2258dde077e21a163aac81d797ee0f9284ba056.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101044 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/layout.adb31
1 files changed, 21 insertions, 10 deletions
diff --git a/gcc/ada/layout.adb b/gcc/ada/layout.adb
index 212dd3cd751..1f4cd9ba21a 100644
--- a/gcc/ada/layout.adb
+++ b/gcc/ada/layout.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2004 Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2005 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- --
@@ -993,12 +993,6 @@ package body Layout is
Decl := Parent (Parent (Entity (N)));
Size := (Discrim, Size.Nod);
Vtyp := Defining_Identifier (Decl);
-
- -- Ensure that we get a private type's full type
-
- if Present (Underlying_Type (Vtyp)) then
- Vtyp := Underlying_Type (Vtyp);
- end if;
end if;
Typ := Etype (N);
@@ -1029,8 +1023,8 @@ package body Layout is
-- Calculate proper type for insertions
- if Is_Record_Type (Scope (E)) then
- Insert_Typ := Scope (E);
+ if Is_Record_Type (Underlying_Type (Scope (E))) then
+ Insert_Typ := Underlying_Type (Scope (E));
else
Insert_Typ := E;
end if;
@@ -2951,6 +2945,8 @@ package body Layout is
Decl : Node_Id;
+ Vtype_Primary_View : Entity_Id;
+
function Check_Node_V_Ref (N : Node_Id) return Traverse_Result;
-- Function used to check one node for reference to V
@@ -2992,6 +2988,21 @@ package body Layout is
if Has_V_Ref (Expr) = Abandon then
pragma Assert (Present (Vtype));
+
+ -- Check whether Vtype is a view of a private type and ensure that
+ -- we use the primary view of the type (which is denoted by its
+ -- Etype, whether it's the type's partial or full view entity).
+ -- This is needed to make sure that we use the same (primary) view
+ -- of the type for all V formals, whether the current view of the
+ -- type is the partial or full view, so that types will always
+ -- match on calls from one size function to another.
+
+ if Has_Private_Declaration (Vtype) then
+ Vtype_Primary_View := Etype (Vtype);
+ else
+ Vtype_Primary_View := Vtype;
+ end if;
+
Set_Is_Discrim_SO_Function (K);
Decl :=
@@ -3005,7 +3016,7 @@ package body Layout is
Defining_Identifier =>
Make_Defining_Identifier (Loc, Chars => Vname),
Parameter_Type =>
- New_Occurrence_Of (Vtype, Loc))),
+ New_Occurrence_Of (Vtype_Primary_View, Loc))),
Subtype_Mark =>
New_Occurrence_Of (Standard_Unsigned, Loc)),