Updating a comment related to the implementation of -Woverloaded-virtual, and adding a FIXME to a test case. (Drive-by removal of trailing whitespace in the test case as well.)

No functional changes.

llvm-svn: 214362
This commit is contained in:
Aaron Ballman 2014-07-30 23:50:53 +00:00
parent 293cbf6ffe
commit 04559a7941
2 changed files with 28 additions and 3 deletions

View File

@ -5945,7 +5945,14 @@ static bool FindHiddenVirtualMethod(const CXXBaseSpecifier *Specifier,
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.

View File

@ -48,8 +48,8 @@ struct Base {
void Base::foo(int) { }
struct Derived : public Base {
virtual void foo(int);
void foo(int, int);
virtual void foo(int);
void foo(int, int);
};
}
@ -138,3 +138,21 @@ namespace {
// 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.
}
}