Fix <rdar://problem/6252216> compare block to NULL.
llvm-svn: 56764
This commit is contained in:
parent
d3dcb4f8ed
commit
e18f94c20d
|
@ -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)) {
|
||||
|
|
|
@ -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 *)'}}
|
||||
|
|
Loading…
Reference in New Issue