forked from OSchip/llvm-project
				
			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
 | 
					    ImpCastExprToType(rex, lType); // promote the pointer to pointer
 | 
				
			||||||
    return Context.IntTy;
 | 
					    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 ((lType->isObjCQualifiedIdType() || rType->isObjCQualifiedIdType())) {
 | 
				
			||||||
    if (ObjCQualifiedIdTypesAreCompatible(lType, rType, true)) {
 | 
					    if (ObjCQualifiedIdTypesAreCompatible(lType, rType, true)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,10 @@ int foo3() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int funk(char *s) {
 | 
					static int funk(char *s) {
 | 
				
			||||||
 | 
					  if (^{} == ((void*)0))
 | 
				
			||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
 | 
					  else 
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void foo4() {
 | 
					void foo4() {
 | 
				
			||||||
  int (^xx)(const char *s) = ^(char *s) { return 1; }; // expected-warning {{incompatible block pointer types initializing 'int (^)(char *)', expected 'int (^)(char const *)'}}
 | 
					  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