c-opts.c (c_common_post_options): Set -ffp-contract=off in C standards modes.
c-family: * c-opts.c (c_common_post_options): Set -ffp-contract=off in C standards modes. * c-cppbuiltin.c (cpp_iec_559_value): Consider -ffp-contract=fast to mean lack of IEEE 754 support. testsuite: * gcc.dg/torture/c99-contract-1.c: New test. From-SVN: r204460
This commit is contained in:
parent
1d2217b6ab
commit
6dbe09581a
5 changed files with 49 additions and 5 deletions
|
@ -1,3 +1,10 @@
|
|||
2013-11-06 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* c-opts.c (c_common_post_options): Set -ffp-contract=off in C
|
||||
standards modes.
|
||||
* c-cppbuiltin.c (cpp_iec_559_value): Consider -ffp-contract=fast
|
||||
to mean lack of IEEE 754 support.
|
||||
|
||||
2013-11-05 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
* c.opt (-Wdate-time): New option
|
||||
|
|
|
@ -726,16 +726,19 @@ cpp_iec_559_value (void)
|
|||
ret = 0;
|
||||
|
||||
/* In strict C standards conformance mode, consider unpredictable
|
||||
excess precision to mean lack of IEEE 754 support. ??? The same
|
||||
should apply to unpredictable contraction, but at present
|
||||
standards conformance options do not enable conforming
|
||||
contraction. For C++, and outside strict conformance mode, do
|
||||
not consider these options to mean lack of IEEE 754 support. */
|
||||
excess precision to mean lack of IEEE 754 support. The same
|
||||
applies to unpredictable contraction. For C++, and outside
|
||||
strict conformance mode, do not consider these options to mean
|
||||
lack of IEEE 754 support. */
|
||||
if (flag_iso
|
||||
&& !c_dialect_cxx ()
|
||||
&& TARGET_FLT_EVAL_METHOD != 0
|
||||
&& flag_excess_precision_cmdline != EXCESS_PRECISION_STANDARD)
|
||||
ret = 0;
|
||||
if (flag_iso
|
||||
&& !c_dialect_cxx ()
|
||||
&& flag_fp_contract_mode == FP_CONTRACT_FAST)
|
||||
ret = 0;
|
||||
|
||||
/* Various options are contrary to IEEE 754 semantics. */
|
||||
if (flag_unsafe_math_optimizations
|
||||
|
|
|
@ -827,6 +827,15 @@ c_common_post_options (const char **pfilename)
|
|||
? EXCESS_PRECISION_STANDARD
|
||||
: EXCESS_PRECISION_FAST);
|
||||
|
||||
/* ISO C restricts floating-point expression contraction to within
|
||||
source-language expressions (-ffp-contract=on, currently an alias
|
||||
for -ffp-contract=off). */
|
||||
if (flag_iso
|
||||
&& !c_dialect_cxx ()
|
||||
&& (global_options_set.x_flag_fp_contract_mode
|
||||
== (enum fp_contract_mode) 0))
|
||||
flag_fp_contract_mode = FP_CONTRACT_OFF;
|
||||
|
||||
/* By default we use C99 inline semantics in GNU99 or C99 mode. C99
|
||||
inline semantics are not supported in GNU89 or C89 mode. */
|
||||
if (flag_gnu89_inline == -1)
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2013-11-06 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/torture/c99-contract-1.c: New test.
|
||||
|
||||
2013-11-06 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/58653
|
||||
|
|
21
gcc/testsuite/gcc.dg/torture/c99-contract-1.c
Normal file
21
gcc/testsuite/gcc.dg/torture/c99-contract-1.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
/* Test floating-point contraction occurs only within source language
|
||||
expressions. */
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-std=c99 -pedantic-errors" } */
|
||||
|
||||
extern void abort (void);
|
||||
extern void exit (int);
|
||||
|
||||
volatile float a = 1 + 0x1p-23f, b = 1 - 0x1p-23f, c = -1;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
float av = a, bv = b, cv = c;
|
||||
float p = av * bv;
|
||||
float r = p + cv;
|
||||
if (r == 0)
|
||||
exit (0);
|
||||
else
|
||||
abort ();
|
||||
}
|
Loading…
Add table
Reference in a new issue