Patch to compare to objective-c static types where one or the other

(but not both) may be a protocol qualified static type.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45283 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Fariborz Jahanian 2007-12-21 17:34:43 +00:00
Родитель 88d752103b
Коммит b145e7dede
2 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -1225,12 +1225,27 @@ bool ASTContext::builtinTypesAreCompatible(QualType lhs, QualType rhs) {
return lBuiltin->getKind() == rBuiltin->getKind();
}
/// objcTypesAreCompatible - This routine is called when two types
/// are of different class; one is interface type or is
/// a qualified interface type and the other type is of a different class.
/// Example, II or II<P>.
bool ASTContext::objcTypesAreCompatible(QualType lhs, QualType rhs) {
if (lhs->isObjcInterfaceType() && isObjcIdType(rhs))
return true;
else if (isObjcIdType(lhs) && rhs->isObjcInterfaceType())
return true;
if (ObjcInterfaceType *lhsIT =
dyn_cast<ObjcInterfaceType>(lhs.getCanonicalType().getTypePtr())) {
ObjcQualifiedInterfaceType *rhsQI =
dyn_cast<ObjcQualifiedInterfaceType>(rhs.getCanonicalType().getTypePtr());
return rhsQI && (lhsIT->getDecl() == rhsQI->getDecl());
}
else if (ObjcInterfaceType *rhsIT =
dyn_cast<ObjcInterfaceType>(rhs.getCanonicalType().getTypePtr())) {
ObjcQualifiedInterfaceType *lhsQI =
dyn_cast<ObjcQualifiedInterfaceType>(lhs.getCanonicalType().getTypePtr());
return lhsQI && (rhsIT->getDecl() == lhsQI->getDecl());
}
return false;
}

Просмотреть файл

@ -0,0 +1,25 @@
// RUN: clang -fsyntax-only -verify %s
extern void foo();
@protocol MyProtocol @end
@interface MyClass @end
int main()
{
MyClass <MyProtocol> *obj_p;
MyClass *obj_cp;
obj_cp = obj_p;
obj_p = obj_cp;
if (obj_cp == obj_p)
foo();
if (obj_p == obj_cp)
foo();
}