[cfe-commits] r103672 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaExprObjC.cpp lib/Sema/SemaOverload.cpp test/SemaObjCXX/conversion-to-objc-pointer.mm

Fariborz Jahanian fjahanian at apple.com
Wed May 12 16:29:11 PDT 2010


Author: fjahanian
Date: Wed May 12 18:29:11 2010
New Revision: 103672

URL: http://llvm.org/viewvc/llvm-project?rev=103672&view=rev
Log:
Objective-C++ Sema. Support for conversion of a C++
class object used as a receiver to an objective-c
pointer via a converwsion function. wip.

Added:
    cfe/trunk/test/SemaObjCXX/conversion-to-objc-pointer.mm
Modified:
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/lib/Sema/SemaOverload.cpp

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=103672&r1=103671&r2=103672&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Wed May 12 18:29:11 2010
@@ -1162,6 +1162,9 @@
   ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
   bool PerformContextuallyConvertToBool(Expr *&From);
 
+  ImplicitConversionSequence TryContextuallyConvertToObjCId(Expr *From);
+  bool PerformContextuallyConvertToObjCId(Expr *&From);
+
   bool PerformObjectMemberConversion(Expr *&From,
                                      NestedNameSpecifier *Qualifier,
                                      NamedDecl *FoundDecl,

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=103672&r1=103671&r2=103672&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed May 12 18:29:11 2010
@@ -976,6 +976,16 @@
           ImpCastExprToType(Receiver, Context.getObjCIdType(),
                             CastExpr::CK_IntegralToPointer);
         ReceiverType = Receiver->getType();
+      } 
+      else if (!PerformContextuallyConvertToObjCId(Receiver)) {
+        return BuildInstanceMessage(Owned(Receiver),
+                                    ReceiverType,
+                                    SuperLoc,
+                                    Sel,
+                                    Method,
+                                    LBracLoc, 
+                                    RBracLoc,
+                                    move(ArgsIn));
       } else {
         // Reject other random receiver types (e.g. structs).
         Diag(Loc, diag::err_bad_receiver_type)

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=103672&r1=103671&r2=103672&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed May 12 18:29:11 2010
@@ -2931,6 +2931,27 @@
                   << From->getType() << From->getSourceRange();
   return true;
 }
+  
+/// TryContextuallyConvertToObjCId - Attempt to contextually convert the
+/// expression From to 'id'.
+ImplicitConversionSequence Sema::TryContextuallyConvertToObjCId(Expr *From) {
+  QualType Ty = Context.getObjCObjectPointerType(Context.ObjCBuiltinIdTy);
+    return TryImplicitConversion(From, Ty,
+                                 // FIXME: Are these flags correct?
+                                 /*SuppressUserConversions=*/false,
+                                 /*AllowExplicit=*/true,
+                                 /*InOverloadResolution=*/false);
+}
+  
+/// PerformContextuallyConvertToObjCId - Perform a contextual conversion
+/// of the expression From to 'id'.
+bool Sema::PerformContextuallyConvertToObjCId(Expr *&From) {
+  QualType Ty = Context.getObjCObjectPointerType(Context.ObjCBuiltinIdTy);
+  ImplicitConversionSequence ICS = TryContextuallyConvertToObjCId(From);
+  if (!ICS.isBad())
+    return PerformImplicitConversion(From, Ty, ICS, AA_Converting);
+  return true;
+}
 
 /// AddOverloadCandidate - Adds the given function to the set of
 /// candidate functions, using the given function call arguments.  If

Added: cfe/trunk/test/SemaObjCXX/conversion-to-objc-pointer.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/conversion-to-objc-pointer.mm?rev=103672&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjCXX/conversion-to-objc-pointer.mm (added)
+++ cfe/trunk/test/SemaObjCXX/conversion-to-objc-pointer.mm Wed May 12 18:29:11 2010
@@ -0,0 +1,51 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// rdar: // 7963410
+
+template<class T>
+class TNSAutoRef
+{
+public:
+	TNSAutoRef(T t)
+		:	fRef(t)
+		{ }
+
+	~TNSAutoRef()
+		{  }
+
+	operator T() const
+		{ return fRef; }
+	
+	T Get() const
+		{ return fRef; }
+
+private:
+	T fRef;
+};
+
+ at interface NSObject
+- (id) alloc;
+- (id)init;
+ at end
+
+ at interface TFoo : NSObject
+
+- (void) foo;
+ at end
+
+ at implementation TFoo
+
+- (void) foo
+	{}
+ at end
+
+ at interface TBar : NSObject
+ at end
+
+ at implementation TBar 
+ at end
+
+int main () {
+	TNSAutoRef<TBar*> bar([[TBar alloc] init]);
+	[bar foo];
+	return 0;
+}





More information about the cfe-commits mailing list