]> granicus.if.org Git - clang/commitdiff
Verify/add code to make sure types passed to interfaceTypesAreCompatible
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 7 Jan 2008 20:12:21 +0000 (20:12 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 7 Jan 2008 20:12:21 +0000 (20:12 +0000)
are canonical. Asst in interfaceTypesAreCompatible if they are not.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45717 91177308-0d34-0410-b5e6-96231b3b80d8

AST/ASTContext.cpp

index a9a3d572938a24e566051aad0762a1181be83dd1..e8e5bcc6ab5873fe887843b45a78176cc70236c3 100644 (file)
@@ -1250,7 +1250,13 @@ bool ASTContext::objcTypesAreCompatible(QualType lhs, QualType rhs) {
   return false;
 }
 
+/// Check that 'lhs' and 'rhs' are compatible interface types. Both types
+/// must be canonical types.
 bool ASTContext::interfaceTypesAreCompatible(QualType lhs, QualType rhs) {
+  assert (lhs->isCanonical() &&
+          "interfaceTypesAreCompatible strip typedefs of lhs");
+  assert (rhs->isCanonical() &&
+          "interfaceTypesAreCompatible strip typedefs of rhs");
   if (lhs == rhs)
     return true;
   ObjCInterfaceType *lhsIT = cast<ObjCInterfaceType>(lhs.getTypePtr());
@@ -1274,8 +1280,9 @@ bool ASTContext::QualifiedInterfaceTypesAreCompatible(QualType lhs,
   ObjCQualifiedInterfaceType *rhsQI = 
     dyn_cast<ObjCQualifiedInterfaceType>(rhs.getCanonicalType().getTypePtr());
   assert(rhsQI && "QualifiedInterfaceTypesAreCompatible - bad rhs type");
-  if (!interfaceTypesAreCompatible(getObjCInterfaceType(lhsQI->getDecl()), 
-                                   getObjCInterfaceType(rhsQI->getDecl())))
+  if (!interfaceTypesAreCompatible(
+         getObjCInterfaceType(lhsQI->getDecl()).getCanonicalType(), 
+         getObjCInterfaceType(rhsQI->getDecl()).getCanonicalType()))
     return false;
   /* All protocols in lhs must have a presense in rhs. */
   for (unsigned i =0; i < lhsQI->getNumProtocols(); i++) {