diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-07-01 02:14:45 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-07-01 02:14:45 +0000 |
| commit | fb0c0d37b7f2d15cf34595b99793ecdbb97a931d (patch) | |
| tree | 61303bc3fa370a6f414bb6f7f80b1dc502bde77e /clang/lib | |
| parent | d4322231639e39b187695e6443bacdc9d16bc4fb (diff) | |
| download | bcm5719-llvm-fb0c0d37b7f2d15cf34595b99793ecdbb97a931d.tar.gz bcm5719-llvm-fb0c0d37b7f2d15cf34595b99793ecdbb97a931d.zip | |
Extend the "cannot convert from base class pointer to derived class
pointer" diagnostic to handle references, too.
llvm-svn: 107372
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 6335cc1fcb7..664c4f3c093 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -5486,7 +5486,7 @@ void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) { } // Diagnose base -> derived pointer conversions. - bool IsBaseToDerivedConversion = false; + unsigned BaseToDerivedConversion = 0; if (const PointerType *FromPtrTy = FromTy->getAs<PointerType>()) { if (const PointerType *ToPtrTy = ToTy->getAs<PointerType>()) { if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs( @@ -5495,7 +5495,7 @@ void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) { !ToPtrTy->getPointeeType()->isIncompleteType() && S.IsDerivedFrom(ToPtrTy->getPointeeType(), FromPtrTy->getPointeeType())) - IsBaseToDerivedConversion = true; + BaseToDerivedConversion = 1; } } else if (const ObjCObjectPointerType *FromPtrTy = FromTy->getAs<ObjCObjectPointerType>()) { @@ -5506,13 +5506,21 @@ void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) { if (ToPtrTy->getPointeeType().isAtLeastAsQualifiedAs( FromPtrTy->getPointeeType()) && FromIface->isSuperClassOf(ToIface)) - IsBaseToDerivedConversion = true; - } - if (IsBaseToDerivedConversion) { + BaseToDerivedConversion = 2; + } else if (const ReferenceType *ToRefTy = ToTy->getAs<ReferenceType>()) { + if (ToRefTy->getPointeeType().isAtLeastAsQualifiedAs(FromTy) && + !FromTy->isIncompleteType() && + !ToRefTy->getPointeeType()->isIncompleteType() && + S.IsDerivedFrom(ToRefTy->getPointeeType(), FromTy)) + BaseToDerivedConversion = 3; + } + + if (BaseToDerivedConversion) { S.Diag(Fn->getLocation(), - diag::note_ovl_candidate_bad_base_to_derived_ptr_conv) + diag::note_ovl_candidate_bad_base_to_derived_conv) << (unsigned) FnKind << FnDesc << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) + << (BaseToDerivedConversion - 1) << FromTy << ToTy << I+1; return; } |

