Fix rdar://6770142 - Class and qualified id's are compatible, just like

Class and unqualified id's are.

llvm-svn: 68899
This commit is contained in:
Chris Lattner 2009-04-12 09:02:39 +00:00
parent baa405fc4c
commit 0d5640c7be
4 changed files with 24 additions and 7 deletions

View File

@ -3060,8 +3060,7 @@ Sema::CheckSingleAssignmentConstraints(QualType lhsType, Expr *&rExpr) {
if (PerformImplicitConversion(rExpr, lhsType.getUnqualifiedType(),
"assigning"))
return Incompatible;
else
return Compatible;
return Compatible;
}
// FIXME: Currently, we fall through and treat C++ classes like C

View File

@ -681,11 +681,15 @@ bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
// Allow id<P..> and an 'id' or void* type in all cases.
if (const PointerType *PT = lhs->getAsPointerType()) {
QualType PointeeTy = PT->getPointeeType();
if (Context.isObjCIdStructType(PointeeTy) || PointeeTy->isVoidType())
if (PointeeTy->isVoidType() ||
Context.isObjCIdStructType(PointeeTy) ||
Context.isObjCClassStructType(PointeeTy))
return true;
} else if (const PointerType *PT = rhs->getAsPointerType()) {
QualType PointeeTy = PT->getPointeeType();
if (Context.isObjCIdStructType(PointeeTy) || PointeeTy->isVoidType())
if (PointeeTy->isVoidType() ||
Context.isObjCIdStructType(PointeeTy) ||
Context.isObjCClassStructType(PointeeTy))
return true;
}

View File

@ -44,7 +44,7 @@ int main()
obj_p = obj; /* Ok */
obj_p = obj_c; // expected-warning {{incompatible type assigning 'MyClass *', expected 'id<MyProtocol>'}}
obj_p = obj_cp; /* Ok */
obj_p = obj_C; // expected-warning {{incompatible type assigning 'Class', expected 'id<MyProtocol>'}}
obj_p = obj_C; // Ok
/* Assigning to a 'MyOtherClass *' variable should always generate
a warning, unless done from an 'id' or an 'id<MyProtocol>' (since

View File

@ -1,6 +1,20 @@
// RUN: clang-cc -fsyntax-only -verify %s
/* Test attempt to redefine 'id' in an incompatible fashion. */
@protocol Foo;
Class T;
id<Foo> S;
id R;
void foo() {
// Test assignment compatibility of Class and id. No warning should be
// produced.
// rdar://6770142 - Class and id<foo> are compatible.
S = T; T = S;
R = T; T = R;
R = S; S = R;
}
// Test attempt to redefine 'id' in an incompatible fashion.
typedef int id; // expected-error {{typedef redefinition with different types}}
id b;