[Ada] Missing front-end code for constraint checks on fixed point exprs
authorEd Schonberg <schonberg@adacore.com>
Wed, 26 Sep 2018 09:19:38 +0000 (09:19 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 26 Sep 2018 09:19:38 +0000 (09:19 +0000)
This patch ensures that the front-end generates constraint checks for
some operations that previously depended on gigi for the corresponding
check. The patch also resets the Do_Range_Check flag so that it never
appears in the tree presented to gigi.

2018-09-26  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* checks.adb (Apply_Type_Conversion_Checks): Do not generate a
range check on the expression of the conversion if it involves a
fixed-point type, as such conversions are handled specially
during expansion.
* exp_ch4.adb (Expand_N_Type_Conversion): In a conversion from
Fixed to Integer, use the base type of the expression to ensure
that the caller will generate the proper constraint check when
needed.

From-SVN: r264632

gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/exp_ch4.adb

index c8145cfb141b7940a09189a9255250c82a711377..8a9d9e1db63bcadc3ccef4ea02bcc4b3d0be5ac2 100644 (file)
@@ -1,3 +1,14 @@
+2018-09-26  Ed Schonberg  <schonberg@adacore.com>
+
+       * checks.adb (Apply_Type_Conversion_Checks): Do not generate a
+       range check on the expression of the conversion if it involves a
+       fixed-point type, as such conversions are handled specially
+       during expansion.
+       * exp_ch4.adb (Expand_N_Type_Conversion): In a conversion from
+       Fixed to Integer, use the base type of the expression to ensure
+       that the caller will generate the proper constraint check when
+       needed.
+
 2018-09-26  Maroua Maalej  <maalej@adacore.com>
 
        * sem_spark.adb (Check_Loop_Statement): Fix a bug related to
index 2e61e5153bf4998da44d628f3f5055f68c64880b..5cefbbd8415942ccd2dec47f5b85e3842ff5e75e 100644 (file)
@@ -3550,8 +3550,21 @@ package body Checks is
                   Apply_Float_Conversion_Check (Expr, Target_Type);
 
                else
-                  Apply_Scalar_Range_Check
-                    (Expr, Target_Type, Fixed_Int => Conv_OK);
+                  --  Conversions involving fixed-point types are expanded
+                  --  separately, and do not need a Range_Check flag, except
+                  --  in SPARK_Mode, where the explicit constraint check will
+                  --  not be generated.
+
+                  if SPARK_Mode = On
+                    or else (not Is_Fixed_Point_Type (Expr_Type)
+                              and then not Is_Fixed_Point_Type (Target_Type))
+                  then
+                     Apply_Scalar_Range_Check
+                       (Expr, Target_Type, Fixed_Int => Conv_OK);
+
+                  else
+                     Set_Do_Range_Check (Expression (N), False);
+                  end if;
 
                   --  If the target type has predicates, we need to indicate
                   --  the need for a check, even if Determine_Range finds that
index 09a6cd0541efaa142b9ce01e43b33f31ca9796f2..a7aee9fcacf2eb6ad26a0be7dc126868c728dbdb 100644 (file)
@@ -11694,6 +11694,11 @@ package body Exp_Ch4 is
             elsif Is_Integer_Type (Etype (N)) then
                Expand_Convert_Fixed_To_Integer (N);
 
+               --  The result of the conversion might need a range check,
+               --   so do not assume that the result is in bounds.
+
+               Set_Etype (N, Base_Type (Target_Type));
+
             else
                pragma Assert (Is_Floating_Point_Type (Etype (N)));
                Expand_Convert_Fixed_To_Float (N);