From d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc=20Poulhi=C3=A8s?= Date: Fri, 8 Oct 2021 10:02:11 +0200 Subject: [PATCH] [Ada] Fix type conversion handling in validity checks gcc/ada/ * checks.adb (Insert_Valid_Check): in case of checked type conversion, update Typ to match Exp's type and add call to Analyze_And_Resolve. --- gcc/ada/checks.adb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index a58a495..c06012b 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -8077,7 +8077,7 @@ package body Checks is Is_High_Bound : Boolean := False) is Loc : constant Source_Ptr := Sloc (Expr); - Typ : constant Entity_Id := Etype (Expr); + Typ : Entity_Id := Etype (Expr); Exp : Node_Id; begin @@ -8137,6 +8137,7 @@ package body Checks is while Nkind (Exp) = N_Type_Conversion loop Exp := Expression (Exp); end loop; + Typ := Etype (Exp); -- Do not generate a check for a variable which already validates the -- value of an assignable object. @@ -8217,6 +8218,14 @@ package body Checks is Set_Do_Range_Check (Validated_Object (Var_Id), False); end if; + -- In case of a type conversion, an expansion of the expr may be + -- needed (eg. fixed-point as actual). + + if Exp /= Expr then + pragma Assert (Nkind (Expr) = N_Type_Conversion); + Analyze_And_Resolve (Expr); + end if; + PV := New_Occurrence_Of (Var_Id, Loc); -- Otherwise the expression does not denote a variable. Force its -- 2.7.4