aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2018-05-29 09:42:05 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-05-29 09:42:05 +0000
commitef22a3b26940b059888ea409a53f5a91af44887d (patch)
tree05d1f19e7f5eb43fc4f1ec7e06934cd79cc17617 /gcc/ada
parent54e33e5f6a0f566e6b0e96da3d5f27449d807248 (diff)
downloadgcc-ef22a3b26940b059888ea409a53f5a91af44887d.zip
gcc-ef22a3b26940b059888ea409a53f5a91af44887d.tar.gz
gcc-ef22a3b26940b059888ea409a53f5a91af44887d.tar.bz2
[Ada] Improper behavior of floating-point attributes
This patch fixes an error in the handling of attributes Pred qnd Succ when applied to the limit values of a floating-point type. The RM mandates that such operations must raise constraint_error, but GNAT generated in most cases an infinite value, regardless of whether overflow checks were enabled. 2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * libgnat/s-fatgen.adb (Succ, Pred): Raise Constraint_Error unconditionally when applied to the largest positive (resp. largest negative) value of a floating-point type. gcc/testsuite/ * gnat.dg/float_attributes_overflows.adb: New testcase. From-SVN: r260882
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/libgnat/s-fatgen.adb18
2 files changed, 8 insertions, 16 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 86d6680..9c529da 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
2018-05-29 Ed Schonberg <schonberg@adacore.com>
+ * libgnat/s-fatgen.adb (Succ, Pred): Raise Constraint_Error
+ unconditionally when applied to the largest positive (resp. largest
+ negative) value of a floating-point type.
+
+2018-05-29 Ed Schonberg <schonberg@adacore.com>
+
* einfo.ads, einfo.adb: Clarify use of Activation_Record_Component:
discriminants and exceptions are never components of such. The flag
Needs_Activation_Record is set on subprogram types, not on access to
diff --git a/gcc/ada/libgnat/s-fatgen.adb b/gcc/ada/libgnat/s-fatgen.adb
index 41e5fe7..d74c3d8 100644
--- a/gcc/ada/libgnat/s-fatgen.adb
+++ b/gcc/ada/libgnat/s-fatgen.adb
@@ -415,16 +415,7 @@ package body System.Fat_Gen is
elsif X = T'First then
- -- If not generating infinities, we raise a constraint error
-
- if T'Machine_Overflows then
- raise Constraint_Error with "Pred of largest negative number";
-
- -- Otherwise generate a negative infinity
-
- else
- return X / (X - X);
- end if;
+ raise Constraint_Error with "Pred of largest negative number";
-- For infinities, return unchanged
@@ -671,15 +662,10 @@ package body System.Fat_Gen is
-- If not generating infinities, we raise a constraint error
- if T'Machine_Overflows then
- raise Constraint_Error with "Succ of largest negative number";
+ raise Constraint_Error with "Succ of largest positive number";
-- Otherwise generate a positive infinity
- else
- return X / (X - X);
- end if;
-
-- For infinities, return unchanged
elsif X < T'First or else X > T'Last then