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:
Joseph Myers 2013-11-06 16:52:47 +00:00 committed by Joseph Myers
parent 1d2217b6ab
commit 6dbe09581a
5 changed files with 49 additions and 5 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View 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 ();
}