summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-07-01 02:14:45 +0000
committerDouglas Gregor <dgregor@apple.com>2010-07-01 02:14:45 +0000
commitfb0c0d37b7f2d15cf34595b99793ecdbb97a931d (patch)
tree61303bc3fa370a6f414bb6f7f80b1dc502bde77e /clang/lib
parentd4322231639e39b187695e6443bacdc9d16bc4fb (diff)
downloadbcm5719-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.cpp20
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;
}
OpenPOWER on IntegriCloud