From: Marc Poulhiès Date: Fri, 8 Oct 2021 08:02:11 +0000 (+0200) Subject: [Ada] Fix type conversion handling in validity checks X-Git-Tag: basepoints/gcc-13~3779 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a;p=thirdparty%2Fgcc.git [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. --- diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index a58a49505a9d..c06012b57a7c 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