Commit 6dbe0958 by Joseph Myers Committed by Joseph Myers

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
parent 1d2217b6
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)
......
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
......
/* 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment