Fixed a warning bug when receiver is an object via
setting of NSObject attribute.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72225 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index c695226..1ad9096 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -506,7 +506,8 @@
 
   // Handle messages to id.
   if (ReceiverCType == Context.getCanonicalType(Context.getObjCIdType()) ||
-      ReceiverCType->isBlockPointerType()) {
+      ReceiverCType->isBlockPointerType() ||
+      Context.isObjCNSObjectType(RExpr->getType())) {
     ObjCMethodDecl *Method = LookupInstanceMethodInGlobalPool(
                                Sel, SourceRange(lbrac,rbrac));
     if (!Method)
diff --git a/test/SemaObjC/nsobject-attribute-1.m b/test/SemaObjC/nsobject-attribute-1.m
new file mode 100644
index 0000000..9528a86
--- /dev/null
+++ b/test/SemaObjC/nsobject-attribute-1.m
@@ -0,0 +1,48 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+@interface NSObject
+- (id)self;
+- (id)copy;
+@end
+
+typedef struct _foo  *__attribute__((NSObject)) Foo_ref;
+
+@interface TestObject {
+    Foo_ref dict;
+}
+@property(retain) Foo_ref dict;
+@end
+
+@implementation TestObject
+@synthesize dict;
+@end
+
+@interface NSDictionary
+- (int)retainCount;
+@end
+
+int main(int argc, char *argv[]) {
+    NSDictionary *dictRef;
+    Foo_ref foo = (Foo_ref)dictRef;
+
+    // do Properties retain?
+    int before = [dictRef retainCount];
+    int after = [dictRef retainCount];
+
+    if ([foo retainCount] != [dictRef retainCount]) {
+    }
+
+    // do Blocks retain?
+    {
+        void (^block)(void) = ^{
+            [foo self];
+        };
+        before = [foo retainCount];
+        id save = [block copy];
+        after = [foo retainCount];
+        if (after <= before) {
+            ;
+        }
+    }
+    return 0;
+}