Commit 84157f51 by Geert Bosch

checks.adb (Insert_Valid_Check): Apply validity check to expression of…

checks.adb (Insert_Valid_Check): Apply validity check to expression of conversion, not to result of conversion.

	* checks.adb (Insert_Valid_Check): Apply validity check to expression
	of conversion, not to result of conversion.

	* sem_ch3.adb (Build_Derived_Record_Type): set Controlled flag
	before freezing parent. If the declarations are mutually recursive,
	an access to the current record type may be frozen before the
	derivation is complete.

From-SVN: r47894
parent d5d7ae5c
2001-12-11 Robert Dewar <dewar@gnat.com>
* checks.adb (Insert_Valid_Check): Apply validity check to expression
of conversion, not to result of conversion.
2001-12-11 Ed Schonberg <schonber@gnat.com>
* sem_ch3.adb (Build_Derived_Record_Type): set Controlled flag
before freezing parent. If the declarations are mutually recursive,
an access to the current record type may be frozen before the
derivation is complete.
2001-12-05 Vincent Celier <celier@gnat.com> 2001-12-05 Vincent Celier <celier@gnat.com>
* gnatcmd.adb: (MAKE): Add new translations: -b /BIND_ONLY, * gnatcmd.adb: (MAKE): Add new translations: -b /BIND_ONLY,
......
...@@ -2691,6 +2691,7 @@ package body Checks is ...@@ -2691,6 +2691,7 @@ package body Checks is
procedure Insert_Valid_Check (Expr : Node_Id) is procedure Insert_Valid_Check (Expr : Node_Id) is
Loc : constant Source_Ptr := Sloc (Expr); Loc : constant Source_Ptr := Sloc (Expr);
Exp : Node_Id;
begin begin
-- Do not insert if checks off, or if not checking validity -- Do not insert if checks off, or if not checking validity
...@@ -2698,27 +2699,35 @@ package body Checks is ...@@ -2698,27 +2699,35 @@ package body Checks is
if Range_Checks_Suppressed (Etype (Expr)) if Range_Checks_Suppressed (Etype (Expr))
or else (not Validity_Checks_On) or else (not Validity_Checks_On)
then then
null; return;
end if;
-- Otherwise insert the validity check. Note that we do this with -- If we have a checked conversion, then validity check applies to
-- validity checks turned off, to avoid recursion, we do not want -- the expression inside the conversion, not the result, since if
-- validity checks on the validity checking code itself! -- the expression inside is valid, then so is the conversion result.
else Exp := Expr;
Validity_Checks_On := False; while Nkind (Exp) = N_Type_Conversion loop
Insert_Action Exp := Expression (Exp);
(Expr, end loop;
Make_Raise_Constraint_Error (Loc,
Condition => -- insert the validity check. Note that we do this with validity
Make_Op_Not (Loc, -- checks turned off, to avoid recursion, we do not want validity
Right_Opnd => -- checks on the validity checking code itself!
Make_Attribute_Reference (Loc,
Prefix => Validity_Checks_On := False;
Duplicate_Subexpr (Expr, Name_Req => True), Insert_Action
Attribute_Name => Name_Valid))), (Expr,
Suppress => All_Checks); Make_Raise_Constraint_Error (Loc,
Validity_Checks_On := True; Condition =>
end if; Make_Op_Not (Loc,
Right_Opnd =>
Make_Attribute_Reference (Loc,
Prefix =>
Duplicate_Subexpr (Exp, Name_Req => True),
Attribute_Name => Name_Valid))),
Suppress => All_Checks);
Validity_Checks_On := True;
end Insert_Valid_Check; end Insert_Valid_Check;
-------------------------- --------------------------
......
...@@ -5032,6 +5032,7 @@ package body Sem_Ch3 is ...@@ -5032,6 +5032,7 @@ package body Sem_Ch3 is
Set_Size_Info (Derived_Type, Parent_Type); Set_Size_Info (Derived_Type, Parent_Type);
Set_RM_Size (Derived_Type, RM_Size (Parent_Type)); Set_RM_Size (Derived_Type, RM_Size (Parent_Type));
Set_Convention (Derived_Type, Convention (Parent_Type)); Set_Convention (Derived_Type, Convention (Parent_Type));
Set_Is_Controlled (Derived_Type, Is_Controlled (Parent_Type));
Set_First_Rep_Item (Derived_Type, First_Rep_Item (Parent_Type)); Set_First_Rep_Item (Derived_Type, First_Rep_Item (Parent_Type));
case Ekind (Parent_Type) is case Ekind (Parent_Type) is
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment