]> granicus.if.org Git - clang/commitdiff
fix PR3932: [ObjC]Type defined as 'id' is not recognized as a valid object type.
authorChris Lattner <sabre@nondot.org>
Sun, 12 Apr 2009 23:51:02 +0000 (23:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 12 Apr 2009 23:51:02 +0000 (23:51 +0000)
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

lib/AST/ASTContext.cpp
test/SemaObjC/property.m

index ac69a38c3dcf2423780ce22b1e324f6254e22b98..f319c3f392ebcdc367b332f5ec98a2674b612414 100644 (file)
@@ -2659,22 +2659,29 @@ bool ASTContext::isObjCObjectPointerType(QualType Ty) const {
     return true;
     
   // All other object types are pointers.
-  if (!Ty->isPointerType())
+  const PointerType *PT = Ty->getAsPointerType();
+  if (PT == 0)
     return false;
   
-  // 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;
-  
   // If this a pointer to an interface (e.g. NSString*), it is ok.
-  if (Ty->getAsPointerType()->getPointeeType()->isObjCInterfaceType())
+  if (PT->getPointeeType()->isObjCInterfaceType() ||
+      // If is has NSObject attribute, OK as well.
+      isObjCNSObjectType(Ty))
     return true;
   
-  // If is has NSObject attribute, OK as well.
-  return isObjCNSObjectType(Ty);
+  // 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.  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();
+  }
+  
+  return false;
 }
 
 /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
index 40bb142d8dfaac3d2f57614c9ffe3e88c678dfdb..5a119c798c90319645ed0869f12506a21c3864ad 100644 (file)
 @property double bar;
 @end
 
-int main() {
+int func1() {
    id foo;
    double bar = [foo bar];
    return 0;
 }
 
+// PR3932
+typedef id BYObjectIdentifier;
+@interface Foo1  {
+  void *isa;
+}
+@property(copy) BYObjectIdentifier identifier;
+@end
+