[cfe-commits] r61359 - in /cfe/trunk: lib/Sema/SemaOverload.cpp test/SemaObjC/blocks.m test/SemaObjCXX/blocks.mm
Douglas Gregor
dgregor at apple.com
Mon Dec 22 16:54:00 PST 2008
Author: dgregor
Date: Mon Dec 22 18:53:59 2008
New Revision: 61359
URL: http://llvm.org/viewvc/llvm-project?rev=61359&view=rev
Log:
Add some block-pointer conversions in C++
Added:
cfe/trunk/test/SemaObjCXX/blocks.mm
Modified:
cfe/trunk/lib/Sema/SemaOverload.cpp
cfe/trunk/test/SemaObjC/blocks.m
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=61359&r1=61358&r2=61359&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Mon Dec 22 18:53:59 2008
@@ -135,7 +135,7 @@
// check for their presence as well as checking whether FromType is
// a pointer.
if (ToType->isBooleanType() &&
- (FromType->isPointerType() ||
+ (FromType->isPointerType() || FromType->isBlockPointerType() ||
First == ICK_Array_To_Pointer || First == ICK_Function_To_Pointer))
return true;
@@ -547,7 +547,8 @@
else if (ToType->isBooleanType() &&
(FromType->isArithmeticType() ||
FromType->isEnumeralType() ||
- FromType->isPointerType())) {
+ FromType->isPointerType() ||
+ FromType->isBlockPointerType())) {
SCS.Second = ICK_Boolean_Conversion;
FromType = Context.BoolTy;
} else {
@@ -857,25 +858,33 @@
return true;
}
+ // Beyond this point, both types need to be pointers or block pointers.
+ QualType ToPointeeType;
const PointerType* ToTypePtr = ToType->getAsPointerType();
- if (!ToTypePtr)
+ if (ToTypePtr)
+ ToPointeeType = ToTypePtr->getPointeeType();
+ else if (const BlockPointerType *ToBlockPtr = ToType->getAsBlockPointerType())
+ ToPointeeType = ToBlockPtr->getPointeeType();
+ else
return false;
- // Beyond this point, both types need to be pointers.
+ QualType FromPointeeType;
const PointerType *FromTypePtr = FromType->getAsPointerType();
- if (!FromTypePtr)
+ if (FromTypePtr)
+ FromPointeeType = FromTypePtr->getPointeeType();
+ else if (const BlockPointerType *FromBlockPtr
+ = FromType->getAsBlockPointerType())
+ FromPointeeType = FromBlockPtr->getPointeeType();
+ else
return false;
- QualType FromPointeeType = FromTypePtr->getPointeeType();
- QualType ToPointeeType = ToTypePtr->getPointeeType();
-
// Objective C++: We're able to convert from a pointer to an
// interface to a pointer to a different interface.
const ObjCInterfaceType* FromIface = FromPointeeType->getAsObjCInterfaceType();
const ObjCInterfaceType* ToIface = ToPointeeType->getAsObjCInterfaceType();
if (FromIface && ToIface &&
Context.canAssignObjCInterfaces(ToIface, FromIface)) {
- ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
+ ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
ToPointeeType,
ToType, Context);
return true;
@@ -887,7 +896,7 @@
// interfaces, which is permitted. However, we're going to
// complain about it.
IncompatibleObjC = true;
- ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
+ ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
ToPointeeType,
ToType, Context);
return true;
@@ -924,7 +933,7 @@
return true;
}
- // If we have pointers to functions, check whether the only
+ // If we have pointers to functions or blocks, check whether the only
// differences in the argument and result types are in Objective-C
// pointer conversions. If so, we permit the conversion (but
// complain about it).
Modified: cfe/trunk/test/SemaObjC/blocks.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/blocks.m?rev=61359&r1=61358&r2=61359&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/blocks.m (original)
+++ cfe/trunk/test/SemaObjC/blocks.m Mon Dec 22 18:53:59 2008
@@ -20,3 +20,7 @@
void foo4(id (^objectCreationBlock)(int)) {
return bar4(objectCreationBlock); // expected-warning{{incompatible block pointer types passing 'id (^)(int)', expected 'id (^)()'}}
}
+
+void foo5(id (^x)(int)) {
+ if (x) { }
+}
Added: cfe/trunk/test/SemaObjCXX/blocks.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/blocks.mm?rev=61359&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjCXX/blocks.mm (added)
+++ cfe/trunk/test/SemaObjCXX/blocks.mm Mon Dec 22 18:53:59 2008
@@ -0,0 +1,26 @@
+// RUN: clang -fsyntax-only -verify -fblocks %s
+ at protocol NSObject;
+
+void bar(id(^)(void));
+void foo(id <NSObject>(^objectCreationBlock)(void)) {
+ return bar(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (^)(void)', expected 'id<NSObject> (^)(void)'}}
+}
+
+void bar2(id(*)(void));
+void foo2(id <NSObject>(*objectCreationBlock)(void)) {
+ return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (*)(void)', expected 'id<NSObject> (*)(void)'}}
+}
+
+void bar3(id(*)());
+void foo3(id (*objectCreationBlock)(int)) {
+ return bar3(objectCreationBlock); // expected-error{{incompatible type passing 'id (*)(int)', expected 'id (*)(void)'}}
+}
+
+void bar4(id(^)());
+void foo4(id (^objectCreationBlock)(int)) {
+ return bar4(objectCreationBlock); // expected-error{{incompatible type passing 'id (^)(int)', expected 'id (^)(void)'}}
+}
+
+void foo5(id (^x)(int)) {
+ if (x) { }
+}
More information about the cfe-commits
mailing list