diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-12 04:46:44 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-12 04:46:44 +0000 |
commit | 61faec1e9cd1ddaaae9e7216c4b751681af271e4 (patch) | |
tree | 16c3118d198dd49c0cf08f69df9a416166801f4c | |
parent | 5d58a1d50e2644668122b8efb6b603a706ecfd6b (diff) |
Use the correct CastKind for derived-to-base pointer conversions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81608 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/Sema.h | 3 | ||||
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 25 | ||||
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 13 |
3 files changed, 25 insertions, 16 deletions
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index d6bc6e51dd..3fb8bcb4ba 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -763,7 +763,8 @@ public: QualType& ConvertedType, bool &IncompatibleObjC); bool isObjCPointerConversion(QualType FromType, QualType ToType, QualType& ConvertedType, bool &IncompatibleObjC); - bool CheckPointerConversion(Expr *From, QualType ToType); + bool CheckPointerConversion(Expr *From, QualType ToType, + CastExpr::CastKind &Kind); bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType, QualType &ConvertedType); bool CheckMemberPointerConversion(Expr *From, QualType ToType, diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index c6147ef269..0883893a3e 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1094,7 +1094,7 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, ImpCastExprToType(From, FromType); break; - case ICK_Pointer_Conversion: + case ICK_Pointer_Conversion: { if (SCS.IncompatibleObjC) { // Diagnose incompatible Objective-C conversions Diag(From->getSourceRange().getBegin(), @@ -1103,18 +1103,21 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, << From->getSourceRange(); } - if (CheckPointerConversion(From, ToType)) + + CastExpr::CastKind Kind = CastExpr::CK_Unknown; + if (CheckPointerConversion(From, ToType, Kind)) return true; - ImpCastExprToType(From, ToType); + ImpCastExprToType(From, ToType, Kind); break; - - case ICK_Pointer_Member: { - CastExpr::CastKind Kind = CastExpr::CK_Unknown; - if (CheckMemberPointerConversion(From, ToType, Kind)) - return true; - ImpCastExprToType(From, ToType, Kind); - break; - } + } + + case ICK_Pointer_Member: { + CastExpr::CastKind Kind = CastExpr::CK_Unknown; + if (CheckMemberPointerConversion(From, ToType, Kind)) + return true; + ImpCastExprToType(From, ToType, Kind); + break; + } case ICK_Boolean_Conversion: FromType = Context.BoolTy; ImpCastExprToType(From, FromType); diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index dde58882a9..7742680b2d 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1135,7 +1135,8 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType, /// conversions for which IsPointerConversion has already returned /// true. It returns true and produces a diagnostic if there was an /// error, or returns false otherwise. -bool Sema::CheckPointerConversion(Expr *From, QualType ToType) { +bool Sema::CheckPointerConversion(Expr *From, QualType ToType, + CastExpr::CastKind &Kind) { QualType FromType = From->getType(); if (const PointerType *FromPtrType = FromType->getAs<PointerType>()) @@ -1147,9 +1148,13 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType) { ToPointeeType->isRecordType()) { // We must have a derived-to-base conversion. Check an // ambiguous or inaccessible conversion. - return CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType, - From->getExprLoc(), - From->getSourceRange()); + if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType, + From->getExprLoc(), + From->getSourceRange())) + return true; + + // The conversion was successful. + Kind = CastExpr::CK_DerivedToBase; } } if (const ObjCObjectPointerType *FromPtrType = |