From 46e54783503c30aecb7e36e6034f915ffc479d33 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 19 Aug 2020 21:54:21 +0200 Subject: [PATCH] [Ada] Fix bogus error on conversion from Float to 128-bit unsigned gcc/ada/ * checks.adb (Apply_Float_Conversion_Check): Saturate the bounds of the check to those of the base type of the expression. --- gcc/ada/checks.adb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 6d20fbbb2e5..35527950757 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -2149,6 +2149,15 @@ package body Checks is Lo_OK := (Lo >= UR_From_Uint (Ifirst)); end if; + -- Saturate the lower bound to that of the expression's type, because + -- we do not want to create an out-of-range value but we still need to + -- do a comparison to catch NaNs. + + if Lo < Expr_Value_R (Type_Low_Bound (Expr_Type)) then + Lo := Expr_Value_R (Type_Low_Bound (Expr_Type)); + Lo_OK := True; + end if; + if Lo_OK then -- Lo_Chk := (X >= Lo) @@ -2183,6 +2192,15 @@ package body Checks is Hi_OK := (Hi <= UR_From_Uint (Ilast)); end if; + -- Saturate the higher bound to that of the expression's type, because + -- we do not want to create an out-of-range value but we still need to + -- do a comparison to catch NaNs. + + if Hi > Expr_Value_R (Type_High_Bound (Expr_Type)) then + Hi := Expr_Value_R (Type_High_Bound (Expr_Type)); + Hi_OK := True; + end if; + if Hi_OK then -- Hi_Chk := (X <= Hi)