if (!MD->isVirtual())
continue;
// If the method we are checking overrides a method from its base
- // don't warn about the other overloaded methods.
+ // don't warn about the other overloaded methods. Clang deviates from GCC
+ // by only diagnosing overloads of inherited virtual functions that do not
+ // override any other virtual functions in the base. GCC's
+ // -Woverloaded-virtual diagnoses any derived function hiding a virtual
+ // function from a base class. These cases may be better served by a
+ // warning (not specific to virtual functions) on call sites when the call
+ // would select a different function from the base class, were it visible.
+ // See FIXME in test/SemaCXX/warn-overload-virtual.cpp for an example.
if (!Data.S->IsOverload(Data.Method, MD, false))
return true;
// Collect the overload only if its hidden.
void Base::foo(int) { }
struct Derived : public Base {
- virtual void foo(int);
- void foo(int, int);
+ virtual void foo(int);
+ void foo(int, int);
};
}
// expected-warning@-1{{hides overloaded virtual functions}}
};
}
+
+namespace {
+struct base {
+ void f(char) {}
+};
+
+struct derived : base {
+ void f(int) {}
+};
+
+void foo(derived &d) {
+ d.f('1'); // FIXME: this should warn about calling (anonymous namespace)::derived::f(int)
+ // instead of (anonymous namespace)::base::f(char).
+ // Note: this should be under a new diagnostic flag and eventually moved to a
+ // new test case since it's not strictly related to virtual functions.
+ d.f(12); // This should not warn.
+}
+}