aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-09-28 01:11:11 +0000
committerSteve Naroff <snaroff@apple.com>2008-09-28 01:11:11 +0000
commite18f94c20debd029b283e380665de3fe9fcd7b7c (patch)
tree0e27d154b7f5a0bb7c06c3e092ad4e9e4c08db84 /clang
parentd3dcb4f8edf3a9ce5a64bc6259fe23153ce702d3 (diff)
downloadllvm-e18f94c20debd029b283e380665de3fe9fcd7b7c.zip
llvm-e18f94c20debd029b283e380665de3fe9fcd7b7c.tar.gz
llvm-e18f94c20debd029b283e380665de3fe9fcd7b7c.tar.bz2
Fix <rdar://problem/6252216> compare block to NULL.
llvm-svn: 56764
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp11
-rw-r--r--clang/test/Sema/block-return.c5
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index dfa53ac..07ce6b0 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2034,6 +2034,17 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation loc,
ImpCastExprToType(rex, lType); // promote the pointer to pointer
return Context.IntTy;
}
+ // Allow block pointers to be compared with null pointer constants.
+ if ((lType->isBlockPointerType() && rType->isPointerType()) ||
+ (lType->isPointerType() && rType->isBlockPointerType())) {
+ if (!LHSIsNull && !RHSIsNull) {
+ Diag(loc, diag::err_typecheck_comparison_of_distinct_blocks,
+ lType.getAsString(), rType.getAsString(),
+ lex->getSourceRange(), rex->getSourceRange());
+ }
+ ImpCastExprToType(rex, lType); // promote the pointer to pointer
+ return Context.IntTy;
+ }
if ((lType->isObjCQualifiedIdType() || rType->isObjCQualifiedIdType())) {
if (ObjCQualifiedIdTypesAreCompatible(lType, rType, true)) {
diff --git a/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c
index ba3a0d2..b88fb9b 100644
--- a/clang/test/Sema/block-return.c
+++ b/clang/test/Sema/block-return.c
@@ -72,7 +72,10 @@ int foo3() {
}
static int funk(char *s) {
- return 1;
+ if (^{} == ((void*)0))
+ return 1;
+ else
+ return 0;
}
void foo4() {
int (^xx)(const char *s) = ^(char *s) { return 1; }; // expected-warning {{incompatible block pointer types initializing 'int (^)(char *)', expected 'int (^)(char const *)'}}