From 1e57a3fb468085249497d6d124b743e08d3a9efc Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 18 Dec 2008 23:43:31 +0000 Subject: [PATCH] Add some more implicit conversions for Objective-C++ llvm-svn: 61229 --- clang/lib/Sema/SemaOverload.cpp | 20 ++++++++++++++++++++ clang/test/SemaObjCXX/overload.mm | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 5e3ec3f4bbd2..3671711964c9 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -846,6 +846,16 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType, return true; } + // Objective C++: Allow conversions between the Objective-C "id" and + // "Class", in either direction. + if ((Context.isObjCIdType(FromPointeeType) && + Context.isObjCClassType(ToPointeeType)) || + (Context.isObjCClassType(FromPointeeType) && + Context.isObjCIdType(ToPointeeType))) { + ConvertedType = ToType; + return true; + } + return false; } @@ -864,6 +874,16 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType) { /*DetectVirtual=*/false); QualType FromPointeeType = FromPtrType->getPointeeType(), ToPointeeType = ToPtrType->getPointeeType(); + + // Objective-C++ conversions are always okay. + // FIXME: We should have a different class of conversions for + // the Objective-C++ implicit conversions. + if (Context.isObjCIdType(FromPointeeType) || + Context.isObjCIdType(ToPointeeType) || + Context.isObjCClassType(FromPointeeType) || + Context.isObjCClassType(ToPointeeType)) + return false; + if (FromPointeeType->isRecordType() && ToPointeeType->isRecordType()) { // We must have a derived-to-base conversion. Check an diff --git a/clang/test/SemaObjCXX/overload.mm b/clang/test/SemaObjCXX/overload.mm index 01ca1c1ce537..16a36fc58b30 100644 --- a/clang/test/SemaObjCXX/overload.mm +++ b/clang/test/SemaObjCXX/overload.mm @@ -1,4 +1,16 @@ // RUN: clang -fsyntax-only -verify %s +@interface Foo +@end + +@implementation Foo + +void func(id); + ++ zone { + func(self); + return self; +} + @protocol P0 @end