From 267c7ff6a07158cb9b904a8a5182ab498b039c72 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 22 Jul 2019 13:58:32 +0000 Subject: [PATCH] [Ada] Fix missing check for no-op conversion to fixed-point type This plugs a small loophole in the compiler for the case of a multiplication or a division in a fixed-point type wrapped in a no-op conversion, e.g. to the same fixed-point type. The front-end fails to generate a range check for the operation. This used to be caught by the back-end, which would generate the range check, but this is no longer the case because we now make sure to reset the Do_Range_Check flag in all cases before invoking the back-end. 2019-07-22 Eric Botcazou gcc/ada/ * exp_ch4.adb (Expand_N_Type_Conversion): Beef up comment. (Fixup_Universal_Fixed_Operation): Set the base type instead of the type of the enclosing type conversion on the operation. gcc/testsuite/ * gnat.dg/fixedpnt6.adb: New testcase. From-SVN: r273695 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/exp_ch4.adb | 9 ++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/fixedpnt6.adb | 21 +++++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/fixedpnt6.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ef329453247..e9b1c3fc168 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2019-07-22 Eric Botcazou + + * exp_ch4.adb (Expand_N_Type_Conversion): Beef up comment. + (Fixup_Universal_Fixed_Operation): Set the base type instead of + the type of the enclosing type conversion on the operation. + 2019-07-22 Ed Schonberg * exp_ch4.adb (Expand_N_In): Do not suggest the use of attribute diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 7ef75f602f4..dc2146c50e5 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -12072,7 +12072,10 @@ package body Exp_Ch4 is -- Check: are these rules stated in sinfo??? if so, why restate here??? -- The only remaining step is to generate a range check if we still have - -- a type conversion at this stage and Do_Range_Check is set. + -- a type conversion at this stage and Do_Range_Check is set. Note that + -- we need to deal with at most 8 out of the 9 possible cases of numeric + -- conversions here, because the float-to-integer case is entirely dealt + -- with by Apply_Float_Conversion_Check. if Nkind (N) = N_Type_Conversion and then Do_Range_Check (Expression (N)) @@ -12726,13 +12729,13 @@ package body Exp_Ch4 is if Nkind (Parent (Conv)) = N_Attribute_Reference and then Attribute_Name (Parent (Conv)) = Name_Round then - Set_Etype (N, Etype (Parent (Conv))); + Set_Etype (N, Base_Type (Etype (Parent (Conv)))); Set_Rounded_Result (N); -- Normal case where type comes from conversion above us else - Set_Etype (N, Etype (Conv)); + Set_Etype (N, Base_Type (Etype (Conv))); end if; end Fixup_Universal_Fixed_Operation; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d8daa2dbdde..9d20101b427 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-07-22 Eric Botcazou + + * gnat.dg/fixedpnt6.adb: New testcase. + 2019-07-22 Ed Schonberg * gnat.dg/warn26.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/fixedpnt6.adb b/gcc/testsuite/gnat.dg/fixedpnt6.adb new file mode 100644 index 00000000000..01c17478511 --- /dev/null +++ b/gcc/testsuite/gnat.dg/fixedpnt6.adb @@ -0,0 +1,21 @@ +-- { dg-do run } +-- { dg-options "-O0" } + +procedure Fixedpnt6 is + + type T is delta 0.125 range -2.0 .. 1.875; + + function Mult (A, B : T) return T is + begin + return T (A * B); + end; + + R : T; + +begin + R := Mult (T'Last, T'Last); + raise Program_Error; +exception + when Constraint_Error => + null; +end; -- 2.30.2