[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