From cf68d92c7bb339d89426558cae2ad731ae8f0508 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Tue, 10 May 2016 10:22:16 +0000 Subject: [PATCH] re PR c/70255 (change of the order of summation of floating point numbers despite no-associative-math) 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 | 6 +++++ gcc/c/c-decl.c | 12 ++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/attr-opt-1.c | 37 +++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/attr-opt-1.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 49c9064854f..9387c73b35e 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2016-05-10 Marek Polacek + + PR c/70255 + * c-decl.c (diagnose_mismatched_decls): Warn for optimize attribute + on a declaration following the definition. + 2016-05-05 Jakub Jelinek * c-parser.c (c_parser_switch_statement): Add IF_P argument, diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 7094efc5dfe..9c09536c18e 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -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))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08392c70800..4f3cc5dca70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-10 Marek Polacek + + PR c/70255 + * gcc.dg/attr-opt-1.c: New test. + 2016-05-10 Richard Biener 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 index 00000000000..4140fda7a2a --- /dev/null +++ b/gcc/testsuite/gcc.dg/attr-opt-1.c @@ -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); -- 2.30.2