diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2013-09-09 23:56:14 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-09-09 23:56:14 +0000 |
| commit | 9d5fffb425dbb3b8c623a8382da7c6ad352d1fdb (patch) | |
| tree | 8fd3b62d302f61c86a0defbf4f4e6000373d7bf1 /clang/lib | |
| parent | 9735f1a06bcd5ec7e5026dbdf7c8b3605cf78323 (diff) | |
| download | bcm5719-llvm-9d5fffb425dbb3b8c623a8382da7c6ad352d1fdb.tar.gz bcm5719-llvm-9d5fffb425dbb3b8c623a8382da7c6ad352d1fdb.zip | |
ObjectiveC migrator. Do not infer NS_RETURNS_INNER_POINTER
annotation on methods which return typedef of pointer to
an incomplete struct type.
llvm-svn: 190372
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/ARCMigrate/ObjCMT.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index 702149e018e..f91741abf89 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -694,6 +694,20 @@ static bool TypeIsInnerPointer(QualType T) { if (T->isObjCObjectPointerType() || T->isObjCBuiltinType() || T->isBlockPointerType() || ento::coreFoundation::isCFObjectRef(T)) return false; + // Also, typedef-of-pointer-to-incomplete-struct is something that we assume + // is not an innter pointer type. + QualType OrigT = T; + while (const TypedefType *TD = dyn_cast<TypedefType>(T.getTypePtr())) + T = TD->getDecl()->getUnderlyingType(); + if (OrigT == T || !T->isPointerType()) + return true; + const PointerType* PT = T->getAs<PointerType>(); + QualType UPointeeT = PT->getPointeeType().getUnqualifiedType(); + if (UPointeeT->isRecordType()) { + const RecordType *RecordTy = UPointeeT->getAs<RecordType>(); + if (!RecordTy->getDecl()->isCompleteDefinition()) + return false; + } return true; } |

