aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-10-27 10:33:19 +0000
committerSteve Naroff <snaroff@apple.com>2008-10-27 10:33:19 +0000
commita5ad8631c963c5d76df18830ac1c226b415903cf (patch)
tree3d1cc4d60f82abe49d6277856e5d9ca5ba399dbd
parent8fe63af0bd8feba4034848211e4e250e1c9ef302 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58241 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExpr.cpp13
-rw-r--r--test/SemaObjC/comptypes-1.m2
2 files changed, 9 insertions, 6 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 5304fd9f7a..d1be2a4a27 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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;
}
diff --git a/test/SemaObjC/comptypes-1.m b/test/SemaObjC/comptypes-1.m
index f6cd3a266b..ab5262e339 100644
--- a/test/SemaObjC/comptypes-1.m
+++ b/test/SemaObjC/comptypes-1.m
@@ -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 *')}}