]> granicus.if.org Git - clang/commitdiff
When -Woverloaded-virtual is triggered, call HandleFunctionTypeMismatch to add
authorRichard Trieu <rtrieu@google.com>
Fri, 5 Apr 2013 23:02:24 +0000 (23:02 +0000)
committerRichard Trieu <rtrieu@google.com>
Fri, 5 Apr 2013 23:02:24 +0000 (23:02 +0000)
more information to the notes.  This information is already present on other
diagnostic messages that involves overloads.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178923 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/warn-overloaded-virtual.cpp

index fe8233b053ea508499b0723daee7c3f1719d8dce..e47c9a4277e3f6f90c3142740b2b3d063ca123e4 100644 (file)
@@ -4686,7 +4686,16 @@ def warn_overloaded_virtual : Warning<
   "%q0 hides overloaded virtual %select{function|functions}1">,
   InGroup<OverloadedVirtual>, DefaultIgnore;
 def note_hidden_overloaded_virtual_declared_here : Note<
-  "hidden overloaded virtual function %q0 declared here">;
+  "hidden overloaded virtual function %q0 declared here"
+  "%select{|: different classes%diff{ ($ vs $)|}2,3"
+  "|: different number of parameters (%2 vs %3)"
+  "|: type mismatch at %ordinal2 parameter%diff{ ($ vs $)|}3,4"
+  "|: different return type%diff{ ($ vs $)|}2,3"
+  "|: different qualifiers ("
+  "%select{none|const|restrict|const and restrict|volatile|const and volatile|"
+  "volatile and restrict|const, volatile, and restrict}2 vs "
+  "%select{none|const|restrict|const and restrict|volatile|const and volatile|"
+  "volatile and restrict|const, volatile, and restrict}3)}1">;
 def warn_using_directive_in_header : Warning<
   "using namespace directive in global context in header">,
   InGroup<HeaderHygiene>, DefaultIgnore;
index 35890e6deb416d7f6923ad1e47bc4de711ebabe3..8f8e22a68a277905bec3702eb8cbdf7559574051 100644 (file)
@@ -5409,8 +5409,10 @@ void Sema::DiagnoseHiddenVirtualMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) {
 
     for (unsigned i = 0, e = Data.OverloadedMethods.size(); i != e; ++i) {
       CXXMethodDecl *overloadedMD = Data.OverloadedMethods[i];
-      Diag(overloadedMD->getLocation(),
+      PartialDiagnostic PD = PDiag(
            diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
+      HandleFunctionTypeMismatch(PD, MD->getType(), overloadedMD->getType());
+      Diag(overloadedMD->getLocation(), PD);
     }
   }
 }
index 9b0f5aa9f339eb673f4db63dddd4ba4f5861c12a..629d59dee53733ec6d2a5a1e3869b41f24eea78c 100644 (file)
@@ -120,3 +120,21 @@ struct MostDerived: Derived3, Derived2 {
   void func();
 };
 }
+
+namespace {
+  class A {
+    virtual int foo(bool) const;
+    // expected-note@-1{{type mismatch at 1st parameter ('bool' vs 'int')}}
+    virtual int foo(int, int) const;
+    // expected-note@-1{{different number of parameters (2 vs 1)}}
+    virtual int foo(int*) const;
+    // expected-note@-1{{type mismatch at 1st parameter ('int *' vs 'int')}}
+    virtual int foo(int) volatile;
+    // expected-note@-1{{different qualifiers (volatile vs const)}}
+  };
+
+  class B : public A {
+    virtual int foo(int) const;
+    // expected-warning@-1{{hides overloaded virtual functions}}
+  };
+}