fix PR3932: [ObjC]Type defined as 'id' is not recognized as a valid object type.
by making ASTContext::isObjCObjectPointerType accept typedefs of id.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68931 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index ac69a38..f319c3f 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -2659,22 +2659,29 @@
     return true;
     
   // All other object types are pointers.
-  if (!Ty->isPointerType())
+  const PointerType *PT = Ty->getAsPointerType();
+  if (PT == 0)
     return false;
   
+  // If this a pointer to an interface (e.g. NSString*), it is ok.
+  if (PT->getPointeeType()->isObjCInterfaceType() ||
+      // If is has NSObject attribute, OK as well.
+      isObjCNSObjectType(Ty))
+    return true;
+  
   // Check to see if this is 'id' or 'Class', both of which are typedefs for
   // pointer types.  This looks for the typedef specifically, not for the
-  // underlying type.
-  if (Ty.getUnqualifiedType() == getObjCIdType() ||
-      Ty.getUnqualifiedType() == getObjCClassType())
-    return true;
+  // underlying type.  Iteratively strip off typedefs so that we can handle
+  // typedefs of typedefs.
+  while (TypedefType *TDT = dyn_cast<TypedefType>(Ty)) {
+    if (Ty.getUnqualifiedType() == getObjCIdType() ||
+        Ty.getUnqualifiedType() == getObjCClassType())
+      return true;
+    
+    Ty = TDT->getDecl()->getUnderlyingType();
+  }
   
-  // If this a pointer to an interface (e.g. NSString*), it is ok.
-  if (Ty->getAsPointerType()->getPointeeType()->isObjCInterfaceType())
-    return true;
-  
-  // If is has NSObject attribute, OK as well.
-  return isObjCNSObjectType(Ty);
+  return false;
 }
 
 /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's