[llvm-branch-commits] [cfe-branch] r117833 - in /cfe/branches/Apple/whitney: lib/AST/ASTContext.cpp test/SemaObjC/comptypes-10.m

Daniel Dunbar daniel at zuster.org
Sat Oct 30 12:43:44 PDT 2010


Author: ddunbar
Date: Sat Oct 30 14:43:44 2010
New Revision: 117833

URL: http://llvm.org/viewvc/llvm-project?rev=117833&view=rev
Log:
Merge r117829:
--
Author: Daniel Dunbar <daniel at zuster.org>
Date:   Sat Oct 30 19:22:48 2010 +0000

    Revert r117678, "Qualified 'id' should implement all of static class type's", it breaks things.

Removed:
    cfe/branches/Apple/whitney/test/SemaObjC/comptypes-10.m
Modified:
    cfe/branches/Apple/whitney/lib/AST/ASTContext.cpp

Modified: cfe/branches/Apple/whitney/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/lib/AST/ASTContext.cpp?rev=117833&r1=117832&r2=117833&view=diff
==============================================================================
--- cfe/branches/Apple/whitney/lib/AST/ASTContext.cpp (original)
+++ cfe/branches/Apple/whitney/lib/AST/ASTContext.cpp Sat Oct 30 14:43:44 2010
@@ -4404,17 +4404,33 @@
 
   if (const ObjCObjectPointerType *lhsOPT =
         lhs->getAsObjCInterfacePointerType()) {
-    // If both the right and left sides have qualifiers.
+    if (lhsOPT->qual_empty()) {
+      bool match = false;
+      if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
+        for (ObjCObjectPointerType::qual_iterator I = rhsQID->qual_begin(),
+             E = rhsQID->qual_end(); I != E; ++I) {
+          // when comparing an id<P> on rhs with a static type on lhs,
+          // static class must implement all of id's protocols directly or
+          // indirectly through its super class.
+          if (lhsID->ClassImplementsProtocol(*I, true)) {
+            match = true;
+            break;
+          }
+        }
+        if (!match)
+          return false;
+      }
+      return true;
+    }
+    // Both the right and left sides have qualifiers.
     for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(),
          E = lhsOPT->qual_end(); I != E; ++I) {
       ObjCProtocolDecl *lhsProto = *I;
       bool match = false;
 
-      // when comparing an id<P> on rhs with a static type on lhs,
+      // when comparing an id<P> on lhs with a static type on rhs,
       // see if static class implements all of id's protocols, directly or
       // through its super class and categories.
-      // First, lhs protocols in the qualifier list must be found, direct
-      // or indirect in rhs's qualifier list or it is a mismatch.
       for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
            E = rhsQID->qual_end(); J != E; ++J) {
         ObjCProtocolDecl *rhsProto = *J;
@@ -4427,35 +4443,6 @@
       if (!match)
         return false;
     }
-    
-    // Static class's protocols, or its super class or category protocols
-    // must be found, direct or indirect in rhs's qualifier list or it is a mismatch.
-    if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) {
-      llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols;
-      CollectInheritedProtocols(lhsID, LHSInheritedProtocols);
-      // This is rather dubious but matches gcc's behavior. If lhs has
-      // no type qualifier and its class has no static protocol(s) assume
-      // assume that it is mismatch.
-      if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty())
-        return false;
-      for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I =
-           LHSInheritedProtocols.begin(),
-           E = LHSInheritedProtocols.end(); I != E; ++I) {
-        bool match = false;
-        ObjCProtocolDecl *lhsProto = (*I);
-        for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(),
-             E = rhsQID->qual_end(); J != E; ++J) {
-          ObjCProtocolDecl *rhsProto = *J;
-          if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
-              (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) {
-            match = true;
-            break;
-          }
-        }
-        if (!match)
-          return false;
-      }
-    }
     return true;
   }
   return false;

Removed: cfe/branches/Apple/whitney/test/SemaObjC/comptypes-10.m
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/test/SemaObjC/comptypes-10.m?rev=117832&view=auto
==============================================================================
--- cfe/branches/Apple/whitney/test/SemaObjC/comptypes-10.m (original)
+++ cfe/branches/Apple/whitney/test/SemaObjC/comptypes-10.m (removed)
@@ -1,34 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
-//rdar: //8591619
-// pr8453
-
- at protocol NSCopying @end
- at protocol NSPROTO @end
- at protocol NSPROTO1 @end
- at protocol NSPROTO2 @end
-
- at interface NSObject <NSCopying, NSPROTO, NSPROTO1> {
-    Class isa;
-}
- at end
-
-void gorf(NSObject <NSCopying> *); // expected-note {{passing argument to parameter here}}
-
-NSObject <NSCopying> *foo(id <NSCopying> bar, id id_obj)
-{
- 	NSObject <NSCopying> *Init = bar; // expected-warning {{initializing 'NSObject<NSCopying> *' with an expression of incompatible type 'id<NSCopying>'}}
-        NSObject *Init1 = bar; // expected-warning {{initializing 'NSObject *' with an expression of incompatible type 'id<NSCopying>'}}
-
- 	NSObject <NSCopying> *I = id_obj; 
-        NSObject *I1 = id_obj; 
-        gorf(bar);	// expected-warning {{passing 'id<NSCopying>' to parameter of incompatible type 'NSObject<NSCopying> *'}}
-
-        gorf(id_obj);	
-
-	return bar; 	// expected-warning {{returning 'id<NSCopying>' from a function with incompatible result type 'NSObject<NSCopying> *'}} 
-}
-
-void test(id <NSCopying, NSPROTO, NSPROTO2> bar)
-{
-  NSObject <NSCopying> *Init = bar; // expected-warning {{initializing 'NSObject<NSCopying> *' with an expression of incompatible type 'id<NSCopying,NSPROTO,NSPROTO2>'}}
-}





More information about the llvm-branch-commits mailing list