aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Poulhiès <poulhies@adacore.com>2021-10-08 10:02:11 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2021-10-20 10:17:03 +0000
commitd9fe0e53d8dbc7cae3170cd6ad783100ec3a704a (patch)
tree88011fa8fe95727127ae8563e847858957f95a36
parentb47b5438b9b95cea90f8d925518e893259255a50 (diff)
downloadgcc-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.
-rw-r--r--gcc/ada/checks.adb11
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