diff options
author | Marc Poulhiès <poulhies@adacore.com> | 2021-10-08 10:02:11 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-10-20 10:17:03 +0000 |
commit | d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a (patch) | |
tree | 88011fa8fe95727127ae8563e847858957f95a36 /gcc | |
parent | b47b5438b9b95cea90f8d925518e893259255a50 (diff) | |
download | gcc-d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a.zip gcc-d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a.tar.gz gcc-d9fe0e53d8dbc7cae3170cd6ad783100ec3a704a.tar.bz2 |
[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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/checks.adb | 11 |
1 files changed, 10 insertions, 1 deletions
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 |