This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH for c++/91921 - stray warning with -Woverloaded-virtual
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jason Merrill <jason at redhat dot com>
- Date: Thu, 26 Sep 2019 21:46:01 -0400
- Subject: C++ PATCH for c++/91921 - stray warning with -Woverloaded-virtual
Here we were emitting a stray "by" message if base_fndecl was in
a system header but fns was not. As usually, we need to guard such
a use. Further, use inform instead of warning_at.
Bootstrapped/regtested on x86_64-linux, ok for trunk?
2019-09-26 Marek Polacek <polacek@redhat.com>
PR c++/91921 - stray warning with -Woverloaded-virtual.
* class.c (warn_hidden): Only emit the second part of
-Woverloaded-virtual if the first part was issued. Use inform instead
warning_at.
* g++.dg/warn/Woverloaded-2.C: New.
* g++.dg/warn/Woverloaded-2.h: New.
* g++.dg/warn/pr61945.C: Turn dg-warning into dg-message.
* g++.old-deja/g++.mike/warn6.C: Likewise.
* g++.old-deja/g++.warn/virt1.C: Likewise.
diff --git gcc/cp/class.c gcc/cp/class.c
index 59a3d1a0496..0fd5e8e188d 100644
--- gcc/cp/class.c
+++ gcc/cp/class.c
@@ -2915,11 +2915,10 @@ warn_hidden (tree t)
if (base_fndecl)
{
/* Here we know it is a hider, and no overrider exists. */
- warning_at (location_of (base_fndecl),
- OPT_Woverloaded_virtual,
- "%qD was hidden", base_fndecl);
- warning_at (location_of (fns),
- OPT_Woverloaded_virtual, " by %qD", fns);
+ if (warning_at (location_of (base_fndecl),
+ OPT_Woverloaded_virtual,
+ "%qD was hidden", base_fndecl))
+ inform (location_of (fns), " by %qD", fns);
}
}
}
diff --git gcc/testsuite/g++.dg/warn/Woverloaded-2.C gcc/testsuite/g++.dg/warn/Woverloaded-2.C
new file mode 100644
index 00000000000..84d65de05ce
--- /dev/null
+++ gcc/testsuite/g++.dg/warn/Woverloaded-2.C
@@ -0,0 +1,9 @@
+// PR c++/91921 - stray warning with -Woverloaded-virtual.
+// { dg-options "-Woverloaded-virtual" }
+
+#include "Woverloaded-2.h"
+
+struct B : A
+{
+ void f(int);
+};
diff --git gcc/testsuite/g++.dg/warn/Woverloaded-2.h gcc/testsuite/g++.dg/warn/Woverloaded-2.h
new file mode 100644
index 00000000000..b9e15b0c331
--- /dev/null
+++ gcc/testsuite/g++.dg/warn/Woverloaded-2.h
@@ -0,0 +1,6 @@
+#pragma GCC system_header
+
+struct A
+{
+ virtual void f();
+};
diff --git gcc/testsuite/g++.dg/warn/pr61945.C gcc/testsuite/g++.dg/warn/pr61945.C
index 5584d841692..3d40581e5e3 100644
--- gcc/testsuite/g++.dg/warn/pr61945.C
+++ gcc/testsuite/g++.dg/warn/pr61945.C
@@ -7,5 +7,5 @@ class A {
};
class B : A {
template <typename>
- void foo (); // { dg-warning "by .B::foo\\(\\)." }
+ void foo (); // { dg-message "by .B::foo\\(\\)." }
};
diff --git gcc/testsuite/g++.old-deja/g++.mike/warn6.C gcc/testsuite/g++.old-deja/g++.mike/warn6.C
index 9c694d62559..26759cfb527 100644
--- gcc/testsuite/g++.old-deja/g++.mike/warn6.C
+++ gcc/testsuite/g++.old-deja/g++.mike/warn6.C
@@ -30,13 +30,13 @@ struct D : public B, public B2, public B3 {
virtual void bothsame(int);
- virtual void bothdiff(int); // { dg-warning "" }
+ virtual void bothdiff(int); // { dg-message "" }
virtual void both2same(int);
virtual void both2same(float);
- virtual void both12diff(int); // { dg-warning "" }
+ virtual void both12diff(int); // { dg-message "" }
- virtual void bothfardiff(int); // { dg-warning "" }
+ virtual void bothfardiff(int); // { dg-message "" }
};
diff --git gcc/testsuite/g++.old-deja/g++.warn/virt1.C gcc/testsuite/g++.old-deja/g++.warn/virt1.C
index 4550dd5e054..c68de8a7e7c 100644
--- gcc/testsuite/g++.old-deja/g++.warn/virt1.C
+++ gcc/testsuite/g++.old-deja/g++.warn/virt1.C
@@ -6,5 +6,5 @@ struct A {
};
struct B: public A {
- void f(int); // { dg-warning "" } by this
+ void f(int); // { dg-message "" } by this
};