make QualifiedInterfaceTypesAreCompatible a static function

and start simplifying it.

llvm-svn: 49307
This commit is contained in:
Chris Lattner 2008-04-07 04:17:40 +00:00
parent ae1b6078e3
commit f96084ee73
2 changed files with 12 additions and 17 deletions

View File

@ -335,7 +335,6 @@ public:
bool builtinTypesAreCompatible(QualType, QualType);
bool vectorTypesAreCompatible(QualType, QualType);
bool QualifiedInterfaceTypesAreCompatible(QualType, QualType);
bool ObjCQualifiedIdTypesAreCompatible(QualType, QualType, bool = false);
bool objcTypesAreCompatible(QualType, QualType);
bool isObjCIdType(QualType T) const {

View File

@ -1443,25 +1443,20 @@ bool ASTContext::objcTypesAreCompatible(QualType LHS, QualType RHS) {
return false;
}
bool ASTContext::QualifiedInterfaceTypesAreCompatible(QualType lhs,
QualType rhs) {
const ObjCQualifiedInterfaceType *lhsQI =
lhs->getAsObjCQualifiedInterfaceType();
const ObjCQualifiedInterfaceType *rhsQI =
rhs->getAsObjCQualifiedInterfaceType();
assert(lhsQI && rhsQI && "QualifiedInterfaceTypesAreCompatible - bad type");
// Verify that the base decls are compatible, the RHS must be a subclass of
static bool
areCompatObjCQualInterfaces(const ObjCQualifiedInterfaceType *LHS,
const ObjCQualifiedInterfaceType *RHS) {
// Verify that the base decls are compatible: the RHS must be a subclass of
// the LHS.
if (!lhsQI->getDecl()->isSuperClassOf(rhsQI->getDecl()))
if (!LHS->getDecl()->isSuperClassOf(RHS->getDecl()))
return false;
// All protocols in lhs must have a presence in rhs.
for (unsigned i = 0; i != lhsQI->getNumProtocols(); ++i) {
// All protocols in LHS must have a presence in RHS.
for (unsigned i = 0; i != LHS->getNumProtocols(); ++i) {
bool match = false;
ObjCProtocolDecl *lhsProto = lhsQI->getProtocols(i);
for (unsigned j = 0; j != rhsQI->getNumProtocols(); ++j) {
ObjCProtocolDecl *rhsProto = rhsQI->getProtocols(j);
ObjCProtocolDecl *lhsProto = LHS->getProtocols(i);
for (unsigned j = 0; j != RHS->getNumProtocols(); ++j) {
ObjCProtocolDecl *rhsProto = RHS->getProtocols(j);
if (lhsProto == rhsProto) {
match = true;
break;
@ -1852,7 +1847,8 @@ bool ASTContext::typesAreCompatible(QualType LHS_NC, QualType RHS_NC) {
case Type::OCUVector:
return vectorTypesAreCompatible(LHS, RHS);
case Type::ObjCQualifiedInterface:
return QualifiedInterfaceTypesAreCompatible(LHS, RHS);
return areCompatObjCQualInterfaces(cast<ObjCQualifiedInterfaceType>(LHS),
cast<ObjCQualifiedInterfaceType>(RHS));
default:
assert(0 && "unexpected type");
}