diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-12 23:51:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-12 23:51:02 +0000 |
commit | 16ede0ec39bf72f5e696e8ed5f1533b29ac2f3d8 (patch) | |
tree | 0f2d53dd3be744436da580b9151641f7a2a4a702 /lib/AST/ASTContext.cpp | |
parent | d0c649f42ee79ee8324026ef9fb9234268dc2485 (diff) |
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
Diffstat (limited to 'lib/AST/ASTContext.cpp')
-rw-r--r-- | lib/AST/ASTContext.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ac69a38c3d..f319c3f392 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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 |