diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-03 20:32:31 +0000 | 
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-03 20:32:31 +0000 | 
| commit | 8c3f06d09c194e37477c4b48c3a419aa7551a32e (patch) | |
| tree | abdb885b9b17e7bb91f6e660526be9447a5ab7ef /clang/lib/Sema/SemaCXXCast.cpp | |
| parent | 45858d2d59718f95fc3ba8dc7aac63d217dc3abd (diff) | |
| download | bcm5719-llvm-8c3f06d09c194e37477c4b48c3a419aa7551a32e.tar.gz bcm5719-llvm-8c3f06d09c194e37477c4b48c3a419aa7551a32e.zip | |
Patch to allow reinterpret_cast on objective-c pointers.
(partial fix for radar 7591784).
llvm-svn: 95245
Diffstat (limited to 'clang/lib/Sema/SemaCXXCast.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 35 | 
1 files changed, 28 insertions, 7 deletions
| diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 093700d9ef5..63823054d85 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -204,7 +204,30 @@ bool UnwrapDissimilarPointerTypes(QualType& T1, QualType& T2) {      T2 = T2PtrType->getPointeeType();      return true;    } - +  const ObjCObjectPointerType *T1ObjCPtrType =  +                                            T1->getAs<ObjCObjectPointerType>(), +                              *T2ObjCPtrType =  +                                            T2->getAs<ObjCObjectPointerType>(); +  if (T1ObjCPtrType) { +    if (T2ObjCPtrType) { +      T1 = T1ObjCPtrType->getPointeeType(); +      T2 = T2ObjCPtrType->getPointeeType(); +      return true; +    } +    else if (T2PtrType) { +      T1 = T1ObjCPtrType->getPointeeType(); +      T2 = T2PtrType->getPointeeType(); +      return true; +    } +  } +  else if (T2ObjCPtrType) { +    if (T1PtrType) { +      T2 = T2ObjCPtrType->getPointeeType(); +      T1 = T1PtrType->getPointeeType(); +      return true; +    } +  } +      const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(),                            *T2MPType = T2->getAs<MemberPointerType>();    if (T1MPType && T2MPType) { @@ -225,9 +248,9 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType) {    // C++ 4.4. We piggyback on Sema::IsQualificationConversion for this, since    // the rules are non-trivial. So first we construct Tcv *...cv* as described    // in C++ 5.2.11p8. -  assert((SrcType->isPointerType() || SrcType->isMemberPointerType()) && +  assert((SrcType->isAnyPointerType() || SrcType->isMemberPointerType()) &&           "Source type is not pointer or pointer to member."); -  assert((DestType->isPointerType() || DestType->isMemberPointerType()) && +  assert((DestType->isAnyPointerType() || DestType->isMemberPointerType()) &&           "Destination type is not pointer or pointer to member.");    QualType UnwrappedSrcType = Self.Context.getCanonicalType(SrcType),  @@ -1083,10 +1106,8 @@ static TryCastResult TryReinterpretCast(Sema &Self, Expr *SrcExpr,      return TC_Failed;    } -  bool destIsPtr =  -    CStyle? DestType->isAnyPointerType() : DestType->isPointerType(); -  bool srcIsPtr =  -    CStyle ? SrcType->isAnyPointerType() : SrcType->isPointerType(); +  bool destIsPtr = DestType->isAnyPointerType(); +  bool srcIsPtr = SrcType->isAnyPointerType();    if (!destIsPtr && !srcIsPtr) {      // Except for std::nullptr_t->integer and lvalue->reference, which are      // handled above, at least one of the two arguments must be a pointer. | 

