re PR c/70255 (change of the order of summation of floating point numbers despite...
authorMarek Polacek <polacek@redhat.com>
Tue, 10 May 2016 10:22:16 +0000 (10:22 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Tue, 10 May 2016 10:22:16 +0000 (10:22 +0000)
PR c/70255
* c-decl.c (diagnose_mismatched_decls): Warn for optimize attribute
on a declaration following the definition.

* gcc.dg/attr-opt-1.c: New test.

From-SVN: r236071

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/attr-opt-1.c [new file with mode: 0644]

index 49c9064854f566debe1c1f91af85802d8def3d10..9387c73b35ee5113bb48d98703a5eaea3e7f41ae 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-10  Marek Polacek  <polacek@redhat.com>
+
+       PR c/70255
+       * c-decl.c (diagnose_mismatched_decls): Warn for optimize attribute
+       on a declaration following the definition.
+
 2016-05-05  Jakub Jelinek  <jakub@redhat.com>
 
        * c-parser.c (c_parser_switch_statement): Add IF_P argument,
index 7094efc5dfe2dc00e2f624b845ee7c00bd719907..9c09536c18edc8a694446f127d48c3be4401fb5e 100644 (file)
@@ -2228,6 +2228,18 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
 
   if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
+      tree a1 = lookup_attribute ("optimize", DECL_ATTRIBUTES (olddecl));
+      tree a2 = lookup_attribute ("optimize", DECL_ATTRIBUTES (newdecl));
+      /* An optimization attribute applied on a declaration after the
+        definition is likely not what the user wanted.  */
+      if (a2 != NULL_TREE
+         && DECL_SAVED_TREE (olddecl) != NULL_TREE
+         && (a1 == NULL_TREE || !attribute_list_equal (a1, a2)))
+       warned |= warning (OPT_Wattributes,
+                          "optimization attribute on %qD follows "
+                          "definition but the attribute doesn%'t match",
+                          newdecl);
+
       /* Diagnose inline __attribute__ ((noinline)) which is silly.  */
       if (DECL_DECLARED_INLINE_P (newdecl)
          && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
index 08392c708007083b88aaac8387d83cfa9f4c388e..4f3cc5dca70cc4b356777999fb437d06f9d74b5c 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-10  Marek Polacek  <polacek@redhat.com>
+
+       PR c/70255
+       * gcc.dg/attr-opt-1.c: New test.
+
 2016-05-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/70497
diff --git a/gcc/testsuite/gcc.dg/attr-opt-1.c b/gcc/testsuite/gcc.dg/attr-opt-1.c
new file mode 100644 (file)
index 0000000..4140fda
--- /dev/null
@@ -0,0 +1,37 @@
+/* PR c/70255 */
+/* { dg-do compile } */
+
+double
+fn1 (double h, double l) /* { dg-message "previous definition" } */
+{
+  return h + l;
+}
+double fn1 (double, double) __attribute__ ((optimize ("no-associative-math"))); /* { dg-warning "optimization attribute on .fn1. follows definition" } */
+
+__attribute__ ((optimize ("no-associative-math"))) double
+fn2 (double h, double l)
+{
+  return h + l;
+}
+double fn2 (double, double) __attribute__ ((optimize ("no-associative-math")));
+
+__attribute__ ((optimize ("no-associative-math"))) double
+fn3 (double h, double l) /* { dg-message "previous definition" } */
+{
+  return h + l;
+}
+double fn3 (double, double) __attribute__ ((optimize ("O2,no-associative-math"))); /* { dg-warning "optimization attribute on .fn3. follows definition" } */
+
+__attribute__ ((optimize ("no-associative-math,O2"))) double
+fn4 (double h, double l) /* { dg-message "previous definition" } */
+{
+  return h + l;
+}
+double fn4 (double, double) __attribute__ ((optimize ("O2,no-associative-math"))); /* { dg-warning "optimization attribute on .fn4. follows definition" } */
+
+__attribute__ ((optimize ("no-reciprocal-math"), optimize ("no-associative-math"))) int
+fn5 (void)
+{
+  return 0;
+}
+int __attribute__ ((optimize ("no-associative-math"), optimize ("no-reciprocal-math"))) fn5 (void);