Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp	(revision 214301)
+++ lib/Sema/SemaDeclCXX.cpp	(working copy)
@@ -5945,7 +5945,14 @@
       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.
Index: test/SemaCXX/warn-overloaded-virtual.cpp
===================================================================
--- test/SemaCXX/warn-overloaded-virtual.cpp	(revision 214301)
+++ test/SemaCXX/warn-overloaded-virtual.cpp	(working copy)
@@ -138,3 +138,25 @@
     // expected-warning@-1{{hides overloaded virtual functions}}
   };
 }
+
+namespace {
+struct base {
+  virtual void f(int) {}
+  virtual void f(double) {}
+  virtual void f(char) {}
+};
+
+struct derived : base {
+  void f(int) {}
+};
+
+struct derived2 : base {
+  void f(double) {}
+};
+
+void foo(derived &d, derived2 &d2) {
+  d.f('1');  // FIXME: this should warn about calling (anonymous namespace)::derived::f(int)
+             // instead of (anonymous namespace)::base::f(char).
+  d2.f(1.2); // This should not warn.
+}
+}
