summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-09-09 23:56:14 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-09-09 23:56:14 +0000
commit9d5fffb425dbb3b8c623a8382da7c6ad352d1fdb (patch)
tree8fd3b62d302f61c86a0defbf4f4e6000373d7bf1 /clang
parent9735f1a06bcd5ec7e5026dbdf7c8b3605cf78323 (diff)
downloadbcm5719-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')
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp14
-rw-r--r--clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m10
-rw-r--r--clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m.result10
3 files changed, 34 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;
}
diff --git a/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m b/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m
index f1a57bde962..404928398fe 100644
--- a/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m
+++ b/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m
@@ -75,6 +75,10 @@ typedef struct __CFDictionary * CFMutableDictionaryRef;
typedef struct CGImage *CGImageRef;
+typedef struct OpaqueJSValue* JSObjectRef;
+
+typedef JSObjectRef TTJSObjectRef;
+
CF_IMPLICIT_BRIDGING_DISABLED
@interface I
@@ -94,3 +98,9 @@ CF_IMPLICIT_BRIDGING_DISABLED
@interface NSMutableData
- (void *)mutableBytes __attribute__((deprecated)) __attribute__((unavailable));
@end
+
+@interface JS
+- (JSObjectRef)JSObject;
+- (TTJSObjectRef)JSObject1;
+- (JSObjectRef*)JSObject2;
+@end
diff --git a/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m.result b/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m.result
index 40d4f66356f..c3f151ab223 100644
--- a/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m.result
+++ b/clang/test/ARCMT/objcmt-ns-returns-inner-pointer.m.result
@@ -75,6 +75,10 @@ typedef struct __CFDictionary * CFMutableDictionaryRef;
typedef struct CGImage *CGImageRef;
+typedef struct OpaqueJSValue* JSObjectRef;
+
+typedef JSObjectRef TTJSObjectRef;
+
CF_IMPLICIT_BRIDGING_DISABLED
@interface I
@@ -94,3 +98,9 @@ CF_IMPLICIT_BRIDGING_DISABLED
@interface NSMutableData
- (void *)mutableBytes __attribute__((deprecated)) __attribute__((unavailable)) NS_RETURNS_INNER_POINTER;
@end
+
+@interface JS
+- (JSObjectRef)JSObject;
+- (TTJSObjectRef)JSObject1;
+- (JSObjectRef*)JSObject2 NS_RETURNS_INNER_POINTER;
+@end
OpenPOWER on IntegriCloud