diff options
author | Ed Schonberg <schonberg@adacore.com> | 2018-05-29 09:42:05 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-05-29 09:42:05 +0000 |
commit | ef22a3b26940b059888ea409a53f5a91af44887d (patch) | |
tree | 05d1f19e7f5eb43fc4f1ec7e06934cd79cc17617 /gcc/ada | |
parent | 54e33e5f6a0f566e6b0e96da3d5f27449d807248 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-fatgen.adb | 18 |
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 |