summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-12-19 16:23:55 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2007-12-19 16:23:55 +0000
commit406348f9fceadc36b19cb480f97ebd5e9adef02f (patch)
tree3732959e913744063b98cc5174226905a7511702 /gcc/ada
parentce35f5a09500166fdb3167bdeaefb26662912b4a (diff)
downloadgcc-406348f9fceadc36b19cb480f97ebd5e9adef02f.tar.gz
2007-12-19 Ed Schonberg <schonberg@adacore.com>
* freeze.adb (Freeze_Record_Type, Check_Current_Instance): Implement properly the Ada2005 rules concerning when the current instance of a record type is aliased. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131076 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/freeze.adb30
1 files changed, 26 insertions, 4 deletions
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index f39ac022d98..f977e7a0e02 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -1452,6 +1452,11 @@ package body Freeze is
procedure Check_Current_Instance (Comp_Decl : Node_Id) is
+ Rec_Type : constant Entity_Id :=
+ Scope (Defining_Identifier (Comp_Decl));
+
+ Decl : constant Node_Id := Parent (Rec_Type);
+
function Process (N : Node_Id) return Traverse_Result;
-- Process routine to apply check to given node
@@ -1486,7 +1491,25 @@ package body Freeze is
-- Start of processing for Check_Current_Instance
begin
- Traverse (Comp_Decl);
+ -- In Ada95, the (imprecise) rule is that the current instance of a
+ -- limited type is aliased. In Ada2005, limitedness must be explicit:
+ -- either a tagged type, or a limited record.
+
+ if Is_Limited_Type (Rec_Type)
+ and then
+ (Ada_Version < Ada_05
+ or else Is_Tagged_Type (Rec_Type))
+ then
+ return;
+
+ elsif Nkind (Decl) = N_Full_Type_Declaration
+ and then Limited_Present (Type_Definition (Decl))
+ then
+ return;
+
+ else
+ Traverse (Comp_Decl);
+ end if;
end Check_Current_Instance;
------------------------
@@ -2028,9 +2051,8 @@ package body Freeze is
Set_Has_Unchecked_Union (Rec);
end if;
- if Has_Per_Object_Constraint (Comp)
- and then not Is_Limited_Type (Rec)
- then
+ if Has_Per_Object_Constraint (Comp) then
+
-- Scan component declaration for likely misuses of current
-- instance, either in a constraint or a default expression.