aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-07-22 13:58:32 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-22 13:58:32 +0000
commit267c7ff6a07158cb9b904a8a5182ab498b039c72 (patch)
tree3c1ee5671289d271dc12cd771402befe2ebdfa8d /gcc/ada
parentad277369b236a39fff13c87a51a8e67f7562a80a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/ada/exp_ch4.adb9
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;