In <http://gcc.gnu.org/ml/gcc-patches/2013-10/msg01131.html>, I noted that, as I'd previously noted in <http://gcc.gnu.org/ml/gcc-patches/2010-10/msg01951.html>, ISO C conformance modes should set -ffp-contract=on (= -ffp-contract=off) rather than the default -ffp-contract=fast, given the ISO C restriction to contraction taking place within source language expressions. No-one indicated any reason not to do this, so I've now applied this patch to do so (and to make an explicit -ffp-contract=fast in ISO C mode imply __GCC_IEC_559=0). Bootstrapped with no regressions on x86_64-unknown-linux-gnu.
c-family: 2013-11-06 Joseph Myers <jos...@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. testsuite: 2013-11-06 Joseph Myers <jos...@codesourcery.com> * gcc.dg/torture/c99-contract-1.c: New test. Index: gcc/c-family/c-cppbuiltin.c =================================================================== --- gcc/c-family/c-cppbuiltin.c (revision 204453) +++ gcc/c-family/c-cppbuiltin.c (working copy) @@ -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 Index: gcc/c-family/c-opts.c =================================================================== --- gcc/c-family/c-opts.c (revision 204453) +++ gcc/c-family/c-opts.c (working copy) @@ -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) Index: gcc/testsuite/gcc.dg/torture/c99-contract-1.c =================================================================== --- gcc/testsuite/gcc.dg/torture/c99-contract-1.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/c99-contract-1.c (revision 0) @@ -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 (); +} -- Joseph S. Myers jos...@codesourcery.com