aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2011-07-01 20:02:53 +0000
committerRichard Trieu <rtrieu@google.com>2011-07-01 20:02:53 +0000
commit304e233921bcd3b55f68c6e8a2960630edf17ff0 (patch)
treeca417dd5a2ae312fc94cd6537dfaedcd4f21e9c4
parentc89edf5aaa08683f4afcf61a7a1d183c08b76498 (diff)
Fix for PR7410. Allow functions in a derived class that improperly overwrite a virtual function in the base class to be inserted into the derived class function list to prevent extra errors every time the derived class is used.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134251 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDecl.cpp2
-rw-r--r--test/SemaCXX/PR7410.cpp13
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index ad1a62eb7f..184c728a02 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -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
index 0000000000..6d2cda90b1
--- /dev/null
+++ b/test/SemaCXX/PR7410.cpp
@@ -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;