diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2019-07-22 13:58:32 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-22 13:58:32 +0000 |
commit | 267c7ff6a07158cb9b904a8a5182ab498b039c72 (patch) | |
tree | 3c1ee5671289d271dc12cd771402befe2ebdfa8d /gcc/ada | |
parent | ad277369b236a39fff13c87a51a8e67f7562a80a (diff) | |
download | gcc-267c7ff6a07158cb9b904a8a5182ab498b039c72.zip gcc-267c7ff6a07158cb9b904a8a5182ab498b039c72.tar.gz gcc-267c7ff6a07158cb9b904a8a5182ab498b039c72.tar.bz2 |
[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 <ebotcazou@adacore.com>
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
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/exp_ch4.adb | 9 |
2 files changed, 12 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ef32945..e9b1c3f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2019-07-22 Eric Botcazou <ebotcazou@adacore.com> + + * 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 <schonberg@adacore.com> * 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 7ef75f6..dc2146c 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; |