diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-12-13 21:29:20 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-12-13 21:29:20 +0000 |
commit | 335b07ae470045dab25739ded6541744ec8fe40b (patch) | |
tree | 4ed2befbef6c2a2f899d7e7f4dd7ba32caed485b /lib/Sema/SemaOverload.cpp | |
parent | 668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9 (diff) |
Don't assume that all conversions to a void pointer are converting
from a PointerType. Fixes PR5756.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91253 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index e498c71b9b..2f6300d5bc 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1723,26 +1723,31 @@ Sema::CompareStandardConversionSequences(const StandardConversionSequence& SCS1, if (SCS2.First == ICK_Array_To_Pointer) FromType2 = Context.getArrayDecayedType(FromType2); - QualType FromPointee1 - = FromType1->getAs<PointerType>()->getPointeeType().getUnqualifiedType(); - QualType FromPointee2 - = FromType2->getAs<PointerType>()->getPointeeType().getUnqualifiedType(); - - if (IsDerivedFrom(FromPointee2, FromPointee1)) - return ImplicitConversionSequence::Better; - else if (IsDerivedFrom(FromPointee1, FromPointee2)) - return ImplicitConversionSequence::Worse; - - // Objective-C++: If one interface is more specific than the - // other, it is the better one. - const ObjCInterfaceType* FromIface1 = FromPointee1->getAs<ObjCInterfaceType>(); - const ObjCInterfaceType* FromIface2 = FromPointee2->getAs<ObjCInterfaceType>(); - if (FromIface1 && FromIface1) { - if (Context.canAssignObjCInterfaces(FromIface2, FromIface1)) - return ImplicitConversionSequence::Better; - else if (Context.canAssignObjCInterfaces(FromIface1, FromIface2)) - return ImplicitConversionSequence::Worse; - } + if (const PointerType *FromPointer1 = FromType1->getAs<PointerType>()) + if (const PointerType *FromPointer2 = FromType2->getAs<PointerType>()) { + QualType FromPointee1 + = FromPointer1->getPointeeType().getUnqualifiedType(); + QualType FromPointee2 + = FromPointer2->getPointeeType().getUnqualifiedType(); + + if (IsDerivedFrom(FromPointee2, FromPointee1)) + return ImplicitConversionSequence::Better; + else if (IsDerivedFrom(FromPointee1, FromPointee2)) + return ImplicitConversionSequence::Worse; + + // Objective-C++: If one interface is more specific than the + // other, it is the better one. + const ObjCInterfaceType* FromIface1 + = FromPointee1->getAs<ObjCInterfaceType>(); + const ObjCInterfaceType* FromIface2 + = FromPointee2->getAs<ObjCInterfaceType>(); + if (FromIface1 && FromIface1) { + if (Context.canAssignObjCInterfaces(FromIface2, FromIface1)) + return ImplicitConversionSequence::Better; + else if (Context.canAssignObjCInterfaces(FromIface1, FromIface2)) + return ImplicitConversionSequence::Worse; + } + } } // Compare based on qualification conversions (C++ 13.3.3.2p3, |