]> granicus.if.org Git - clang/commitdiff
Fix for PR7410. Allow functions in a derived class that improperly overwrite a virtua...
authorRichard Trieu <rtrieu@google.com>
Fri, 1 Jul 2011 20:02:53 +0000 (20:02 +0000)
committerRichard Trieu <rtrieu@google.com>
Fri, 1 Jul 2011 20:02:53 +0000 (20:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134251 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/PR7410.cpp [new file with mode: 0644]

index ad1a62eb7fc0a9e570c30de88f7f9948f0b97754..184c728a026fee92df435705d04f21f90bb6b67d 100644 (file)
@@ -4096,10 +4096,10 @@ bool Sema::AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD) {
     for (CXXBasePaths::decl_iterator I = Paths.found_decls_begin(),
          E = Paths.found_decls_end(); I != E; ++I) {
       if (CXXMethodDecl *OldMD = dyn_cast<CXXMethodDecl>(*I)) {
+        MD->addOverriddenMethod(OldMD->getCanonicalDecl());
         if (!CheckOverridingFunctionReturnType(MD, OldMD) &&
             !CheckOverridingFunctionExceptionSpec(MD, OldMD) &&
             !CheckIfOverriddenFunctionIsMarkedFinal(MD, OldMD)) {
-          MD->addOverriddenMethod(OldMD->getCanonicalDecl());
           AddedAny = true;
         }
       }
diff --git a/test/SemaCXX/PR7410.cpp b/test/SemaCXX/PR7410.cpp
new file mode 100644 (file)
index 0000000..6d2cda9
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+struct BaseReturn {};
+
+struct Base {
+  virtual BaseReturn Foo() = 0;  // expected-note{{overridden virtual function is here}}
+};
+struct X {};
+struct Derived : Base {
+  X Foo();  // expected-error{{virtual function 'Foo' has a different return type ('X') than the function it overrides (which has return type 'BaseReturn')}}
+};
+
+Derived d;