diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2010-01-22 13:07:41 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2010-01-22 13:07:41 +0000 |
commit | ceb7e001c488a7ea09dc631518515290518db47a (patch) | |
tree | a32286973b5bccdf82decdc63a3c5a182c496013 | |
parent | fc9f16c9e64fa145b454ce4e7b7ecdbb3aecdcf3 (diff) |
Fix an obvious goof that caused us to only see the top level of return types
when checking for covariance. Added some fun test cases, fixes PR6110.
This felt obvious enough to just commit. ;] Let me know if anything needs
tweaking.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94173 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 8 | ||||
-rw-r--r-- | test/SemaCXX/virtual-override.cpp | 17 |
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 12b4565cb5..289c0e024d 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -5622,13 +5622,13 @@ bool Sema::CheckOverridingFunctionReturnType(const CXXMethodDecl *New, QualType NewClassTy, OldClassTy; /// Both types must be pointers or references to classes. - if (PointerType *NewPT = dyn_cast<PointerType>(NewTy)) { - if (PointerType *OldPT = dyn_cast<PointerType>(OldTy)) { + if (PointerType *NewPT = dyn_cast<PointerType>(CNewTy)) { + if (PointerType *OldPT = dyn_cast<PointerType>(COldTy)) { NewClassTy = NewPT->getPointeeType(); OldClassTy = OldPT->getPointeeType(); } - } else if (ReferenceType *NewRT = dyn_cast<ReferenceType>(NewTy)) { - if (ReferenceType *OldRT = dyn_cast<ReferenceType>(OldTy)) { + } else if (ReferenceType *NewRT = dyn_cast<ReferenceType>(CNewTy)) { + if (ReferenceType *OldRT = dyn_cast<ReferenceType>(COldTy)) { NewClassTy = NewRT->getPointeeType(); OldClassTy = OldRT->getPointeeType(); } diff --git a/test/SemaCXX/virtual-override.cpp b/test/SemaCXX/virtual-override.cpp index 4fdac85040..a3d3f20f14 100644 --- a/test/SemaCXX/virtual-override.cpp +++ b/test/SemaCXX/virtual-override.cpp @@ -197,3 +197,20 @@ namespace PR5920 { virtual Derived<int>* Method(); }; } + +// Look through template types and typedefs to see whether return types are +// pointers or references. +namespace PR6110 { + class Base {}; + class Derived : public Base {}; + + typedef Base* BaseP; + typedef Derived* DerivedP; + + class X { virtual BaseP f(); }; + class X1 : public X { virtual DerivedP f(); }; + + template <typename T> class Y { virtual T f(); }; + template <typename T1, typename T> class Y1 : public Y<T> { virtual T1 f(); }; + Y1<Derived*, Base*> y; +} |