Among the recent -Wattributes enhancements is to diagnose declarations of void functions with attribute const or pure. Declaring a void function const or pure means that calls to the function have no effect and could be (and, with optimization, are) eliminated. Thus the attribute on such a function would imply that either the function is useless or the attribute is (when the function is called inidirectly).
As it happens, however, -Wsuggest-attribute=const suggests adding the const attribute to candidate functions that return void, thus causing a conflict between the two options. The attached patch resolves the conflict by avoiding -Wsuggest-attribute=const for void functions. Martin
PR c/83559 - -Wsuggest-attribute=const conflicts with -Wattributes warning about const attribute on function returning void gcc/ChangeLog: PR c/83559 * doc/extend.texi (attribute const): Fix a typo. * ipa-pure-const.c ((warn_function_const, warn_function_pure): Avoid issuing -Wsuggest-attribute for void functions. gcc/testsuite/ChangeLog: PR c/83559 * gcc.dg/const-2.c: New test. * gcc.dg/pure-3.c: New test. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 2a553ad..b2339f6 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -2500,7 +2500,7 @@ definition than the similar @code{pure} attribute below because it prohibits the function from reading global variables. Consequently, the presence of the attribute on a function declarations allows GCC to emit more efficient code for some calls to the function. Decorating the same function with -both the @code{const} and the @code{pure} attribute is diagnnosed. +both the @code{const} and the @code{pure} attribute is diagnosed. @cindex pointer arguments Note that a function that has pointer arguments and examines the data diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 09ca359..f5eed37 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -213,9 +213,13 @@ suggest_attribute (int option, tree decl, bool known_finite, static void warn_function_pure (tree decl, bool known_finite) { - static hash_set<tree> *warned_about; + /* Declaring a void function pure makes no sense and is diagnosed + by -Wattributes because calling it would have no effect. */ + if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) + return; - warned_about + static hash_set<tree> *warned_about; + warned_about = suggest_attribute (OPT_Wsuggest_attribute_pure, decl, known_finite, warned_about, "pure"); } @@ -226,8 +230,13 @@ warn_function_pure (tree decl, bool known_finite) static void warn_function_const (tree decl, bool known_finite) { + /* Declaring a void function const makes no sense is diagnosed + by -Wattributes because calling it would have no effect. */ + if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) + return; + static hash_set<tree> *warned_about; - warned_about + warned_about = suggest_attribute (OPT_Wsuggest_attribute_const, decl, known_finite, warned_about, "const"); } diff --git a/gcc/testsuite/gcc.dg/const-2.c b/gcc/testsuite/gcc.dg/const-2.c new file mode 100644 index 0000000..e48005d --- /dev/null +++ b/gcc/testsuite/gcc.dg/const-2.c @@ -0,0 +1,22 @@ +/* PR tree-optimization/83559 - -Wsuggest-attribute=const conflicts with + -Wattributes warning about const attribute on function returning void + { dg-do compile { target nonpic } } + { dg-options "-O2 -Wsuggest-attribute=const" } */ + +int f_i_v (void) /* { dg-warning "candidate for attribute .const." } */ +{ + return 0; +} + +int f_i () /* { dg-warning "candidate for attribute .const." } */ +{ + return 0; +} + +void f_v_v (void) /* { dg-bogus "candidate" } */ +{ +} + +void f_v () /* { dg-bogus "candidate" } */ +{ +} diff --git a/gcc/testsuite/gcc.dg/pure-3.c b/gcc/testsuite/gcc.dg/pure-3.c new file mode 100644 index 0000000..2eeb8a3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pure-3.c @@ -0,0 +1,24 @@ +/* PR tree-optimization/83559 - -Wsuggest-attribute=const conflicts with + -Wattributes warning about const attribute on function returning void + { dg-do compile { target nonpic } } + { dg-options "-O2 -Wsuggest-attribute=pure" } */ + +int global; + +int f_i_v (void) /* { dg-warning "candidate for attribute .pure." } */ +{ + return global; +} + +int f_i () /* { dg-warning "candidate for attribute .pure." } */ +{ + return global; +} + +void f_v_v (void) /* { dg-bogus "candidate" } */ +{ +} + +void f_v () /* { dg-bogus "candidate" } */ +{ +}