summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-cppbuiltin.c13
-rw-r--r--gcc/c-family/c-opts.c9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/torture/c99-contract-1.c21
5 files changed, 49 insertions, 5 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 68929521087..582aa9383d6 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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
diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index 61a124c509c..b9a0f18cd7e 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -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
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 2de5425e654..34fe94de34b 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9d19eb10231..9668d7393e4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/torture/c99-contract-1.c b/gcc/testsuite/gcc.dg/torture/c99-contract-1.c
new file mode 100644
index 00000000000..60230830807
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/c99-contract-1.c
@@ -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 ();
+}
OpenPOWER on IntegriCloud