forked from OSchip/llvm-project
Fix <rdar://problem/6315646> clang on xcode: error: invalid operands to binary expression ('id<NSTableViewDelegate>' and 'XCExtendedArrayController *').
There is still a bug here (as the FIXME in the test case indicates). Prior to this patch, the bug would generate an error. Now, we simply do nothing (which is less harmful until we can get it right). The complete bug fix will require changing ASTContext::mergeTypes(), which I'd like to defer for now. llvm-svn: 58241
This commit is contained in:
parent
450ffd2f3e
commit
1d4a9a31b6
|
@ -2147,11 +2147,14 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation loc,
|
|||
}
|
||||
|
||||
if ((lType->isObjCQualifiedIdType() || rType->isObjCQualifiedIdType())) {
|
||||
if ((lType->isPointerType() || rType->isPointerType()) &&
|
||||
!Context.typesAreCompatible(lType, rType)) {
|
||||
Diag(loc, diag::ext_typecheck_comparison_of_distinct_pointers,
|
||||
lType.getAsString(), rType.getAsString(),
|
||||
lex->getSourceRange(), rex->getSourceRange());
|
||||
if (lType->isPointerType() || rType->isPointerType()) {
|
||||
if (!Context.typesAreCompatible(lType, rType)) {
|
||||
Diag(loc, diag::ext_typecheck_comparison_of_distinct_pointers,
|
||||
lType.getAsString(), rType.getAsString(),
|
||||
lex->getSourceRange(), rex->getSourceRange());
|
||||
ImpCastExprToType(rex, lType);
|
||||
return Context.IntTy;
|
||||
}
|
||||
ImpCastExprToType(rex, lType);
|
||||
return Context.IntTy;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ int main()
|
|||
must generate a warning. */
|
||||
/* FIXME: GCC considers this a warning ("comparison of distinct pointer types"). */
|
||||
/* There is a corresponding FIXME in ASTContext::mergeTypes() */
|
||||
if (obj_p == obj_c) foo() ; // expected-error {{invalid operands to binary expression ('id<MyProtocol>' and 'MyClass *')}}
|
||||
if (obj_p == obj_c) foo() ;
|
||||
|
||||
if (obj_c == obj_cp) foo() ; // expected-warning {{comparison of distinct pointer types ('MyClass *' and 'MyOtherClass *')}}
|
||||
if (obj_cp == obj_c) foo() ; // expected-warning {{comparison of distinct pointer types ('MyOtherClass *' and 'MyClass *')}}
|
||||
|
|
Loading…
Reference in New Issue