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" } */
+{
+}

Reply via email to