From ec7cea925e7687bf34ddc186d63ff734453612a8 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 8 Nov 2013 01:15:17 +0000 Subject: [PATCH] ObjectiveC migrator. Fixes an obscure bug where NS_RETURNS_INNER_POINTER ends up unintentionally on the @property under -objcmt-migrate-all // rdar://15396636 llvm-svn: 194233 --- .../include/clang/Frontend/FrontendOptions.h | 3 +- clang/lib/ARCMigrate/ObjCMT.cpp | 8 +- clang/test/ARCMT/objcmt-migrate-all.m | 135 ++++++++++++++++++ clang/test/ARCMT/objcmt-migrate-all.m.result | 134 +++++++++++++++++ 4 files changed, 276 insertions(+), 4 deletions(-) create mode 100644 clang/test/ARCMT/objcmt-migrate-all.m create mode 100644 clang/test/ARCMT/objcmt-migrate-all.m.result diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index eab330d028e8..3b674cf5994d 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -183,8 +183,7 @@ public: ObjCMT_MigrateAll = (ObjCMT_Literals | ObjCMT_Subscripting | ObjCMT_ReadonlyProperty | ObjCMT_ReadwriteProperty | ObjCMT_Annotation | ObjCMT_Instancetype | - ObjCMT_NsMacros | ObjCMT_ProtocolConformance | - ObjCMT_ReturnsInnerPointerProperty) + ObjCMT_NsMacros | ObjCMT_ProtocolConformance) }; unsigned ObjCMTAction; diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index 34cc073044a7..45e1dea96a45 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -412,8 +412,12 @@ void ObjCMigrateASTConsumer::migrateObjCInterfaceDecl(ASTContext &Ctx, ObjCMethodDecl *Method = (*M); if (Method->isDeprecated()) continue; - migrateProperty(Ctx, D, Method); - if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation) + bool PropertyInferred = migrateProperty(Ctx, D, Method); + // If a property is inferred, do not attempt to attach NS_RETURNS_INNER_POINTER to + // the getter method as it ends up on the property itself which we don't want + // to do unless -objcmt-returns-innerpointer-property option is on. + if (!PropertyInferred || + (ASTMigrateActions & FrontendOptions::ObjCMT_ReturnsInnerPointerProperty)) migrateNsReturnsInnerPointer(Ctx, Method); } if (!(ASTMigrateActions & FrontendOptions::ObjCMT_ReturnsInnerPointerProperty)) diff --git a/clang/test/ARCMT/objcmt-migrate-all.m b/clang/test/ARCMT/objcmt-migrate-all.m new file mode 100644 index 000000000000..7ae898cf9cba --- /dev/null +++ b/clang/test/ARCMT/objcmt-migrate-all.m @@ -0,0 +1,135 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -objcmt-migrate-all -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -triple x86_64-apple-darwin11 +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc %s.result +// rdar://15396636 + +#ifndef NS_RETURNS_INNER_POINTER // defined in iOS 6 for sure +#define NS_RETURNS_INNER_POINTER __attribute__((objc_returns_inner_pointer)) +#endif + +#define CF_IMPLICIT_BRIDGING_ENABLED _Pragma("clang arc_cf_code_audited begin") + +#define CF_IMPLICIT_BRIDGING_DISABLED _Pragma("clang arc_cf_code_audited end") + +#if __has_feature(attribute_ns_returns_retained) +#define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) +#endif +#if __has_feature(attribute_cf_returns_retained) +#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) +#endif +#if __has_feature(attribute_ns_returns_not_retained) +#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) +#endif +#if __has_feature(attribute_cf_returns_not_retained) +#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) +#endif +#if __has_feature(attribute_ns_consumes_self) +#define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) +#endif +#if __has_feature(attribute_ns_consumed) +#define NS_CONSUMED __attribute__((ns_consumed)) +#endif +#if __has_feature(attribute_cf_consumed) +#define CF_CONSUMED __attribute__((cf_consumed)) +#endif +#if __has_attribute(ns_returns_autoreleased) +#define NS_RETURNS_AUTORELEASED __attribute__((ns_returns_autoreleased)) +#endif + +#define NS_AVAILABLE __attribute__((availability(macosx,introduced=10.0))) + +CF_IMPLICIT_BRIDGING_ENABLED + +typedef unsigned long CFTypeID; +typedef unsigned long CFOptionFlags; +typedef unsigned long CFHashCode; + +typedef signed long CFIndex; /*AnyObj*/ +typedef const struct __CFArray * CFArrayRef; +typedef struct { + CFIndex location; + CFIndex length; +} CFRange; + +typedef void (*CFArrayApplierFunction)(const void *value, void *context); + +typedef enum CFComparisonResult : CFIndex CFComparisonResult; enum CFComparisonResult : CFIndex { + kCFCompareLessThan = -1L, + kCFCompareEqualTo = 0, + kCFCompareGreaterThan = 1 +}; + + +typedef CFComparisonResult (*CFComparatorFunction)(const void *val1, const void *val2, void *context); + +typedef struct __CFArray * CFMutableArrayRef; + +typedef const struct __CFAttributedString *CFAttributedStringRef; +typedef struct __CFAttributedString *CFMutableAttributedStringRef; + +typedef const struct __CFAllocator * CFAllocatorRef; + +typedef const struct __CFString * CFStringRef; +typedef struct __CFString * CFMutableStringRef; + +typedef const struct __CFDictionary * CFDictionaryRef; +typedef struct __CFDictionary * CFMutableDictionaryRef; + +typedef struct CGImage *CGImageRef; + +typedef struct OpaqueJSValue* JSObjectRef; + +typedef JSObjectRef TTJSObjectRef; +typedef unsigned int NSUInteger; + +CF_IMPLICIT_BRIDGING_DISABLED + +@interface I +- (void*) ReturnsInnerPointer; +- (int*) AlreadyReturnsInnerPointer NS_RETURNS_INNER_POINTER; +@end + +@interface UIImage +- (CGImageRef)CGImage; +@end + +@interface NSData +- (void *)bytes; +- (void **) ptr_bytes __attribute__((availability(macosx,unavailable))); +@end + +@interface NSMutableData +- (void *)mutableBytes __attribute__((deprecated)) __attribute__((unavailable)); +@end + +@interface JS +- (JSObjectRef)JSObject; +- (TTJSObjectRef)JSObject1; +- (JSObjectRef*)JSObject2; +@end + +// rdar://15044991 +typedef void *SecTrustRef; + +@interface NSURLProtectionSpace +@property (readonly) SecTrustRef serverTrust NS_AVAILABLE; +- (void *) FOO NS_AVAILABLE; +@property (readonly) void * mitTrust NS_AVAILABLE; + +@property (readonly) void * mittiTrust; + +@property (readonly) SecTrustRef XserverTrust; + +- (SecTrustRef) FOO1 NS_AVAILABLE; + ++ (const NSURLProtectionSpace *)ProtectionSpace; + +// pointer personality functions +@property NSUInteger (*hashFunction)(const void *item, NSUInteger (*size)(const void *item)); +@end + +@interface MustNotMigrateToInnerPointer +- (void*) nono; +- (void) setNono : (void*) val; +@end diff --git a/clang/test/ARCMT/objcmt-migrate-all.m.result b/clang/test/ARCMT/objcmt-migrate-all.m.result new file mode 100644 index 000000000000..d2ee4090b28c --- /dev/null +++ b/clang/test/ARCMT/objcmt-migrate-all.m.result @@ -0,0 +1,134 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -objcmt-migrate-all -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -triple x86_64-apple-darwin11 +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c -fobjc-runtime-has-weak -fobjc-arc %s.result +// rdar://15396636 + +#ifndef NS_RETURNS_INNER_POINTER // defined in iOS 6 for sure +#define NS_RETURNS_INNER_POINTER __attribute__((objc_returns_inner_pointer)) +#endif + +#define CF_IMPLICIT_BRIDGING_ENABLED _Pragma("clang arc_cf_code_audited begin") + +#define CF_IMPLICIT_BRIDGING_DISABLED _Pragma("clang arc_cf_code_audited end") + +#if __has_feature(attribute_ns_returns_retained) +#define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) +#endif +#if __has_feature(attribute_cf_returns_retained) +#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) +#endif +#if __has_feature(attribute_ns_returns_not_retained) +#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) +#endif +#if __has_feature(attribute_cf_returns_not_retained) +#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) +#endif +#if __has_feature(attribute_ns_consumes_self) +#define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) +#endif +#if __has_feature(attribute_ns_consumed) +#define NS_CONSUMED __attribute__((ns_consumed)) +#endif +#if __has_feature(attribute_cf_consumed) +#define CF_CONSUMED __attribute__((cf_consumed)) +#endif +#if __has_attribute(ns_returns_autoreleased) +#define NS_RETURNS_AUTORELEASED __attribute__((ns_returns_autoreleased)) +#endif + +#define NS_AVAILABLE __attribute__((availability(macosx,introduced=10.0))) + +CF_IMPLICIT_BRIDGING_ENABLED + +typedef unsigned long CFTypeID; +typedef unsigned long CFOptionFlags; +typedef unsigned long CFHashCode; + +typedef signed long CFIndex; /*AnyObj*/ +typedef const struct __CFArray * CFArrayRef; +typedef struct { + CFIndex location; + CFIndex length; +} CFRange; + +typedef void (*CFArrayApplierFunction)(const void *value, void *context); + +typedef enum CFComparisonResult : CFIndex CFComparisonResult; enum CFComparisonResult : CFIndex { + kCFCompareLessThan = -1L, + kCFCompareEqualTo = 0, + kCFCompareGreaterThan = 1 +}; + + +typedef CFComparisonResult (*CFComparatorFunction)(const void *val1, const void *val2, void *context); + +typedef struct __CFArray * CFMutableArrayRef; + +typedef const struct __CFAttributedString *CFAttributedStringRef; +typedef struct __CFAttributedString *CFMutableAttributedStringRef; + +typedef const struct __CFAllocator * CFAllocatorRef; + +typedef const struct __CFString * CFStringRef; +typedef struct __CFString * CFMutableStringRef; + +typedef const struct __CFDictionary * CFDictionaryRef; +typedef struct __CFDictionary * CFMutableDictionaryRef; + +typedef struct CGImage *CGImageRef; + +typedef struct OpaqueJSValue* JSObjectRef; + +typedef JSObjectRef TTJSObjectRef; +typedef unsigned int NSUInteger; + +CF_IMPLICIT_BRIDGING_DISABLED + +@interface I +@property (nonatomic, readonly) void *ReturnsInnerPointer; +@property (nonatomic, readonly) int *AlreadyReturnsInnerPointer NS_RETURNS_INNER_POINTER; +@end + +@interface UIImage +@property (nonatomic, readonly) CGImageRef CGImage CF_RETURNS_NOT_RETAINED; +@end + +@interface NSData +@property (nonatomic, readonly) void *bytes; +@property (nonatomic, readonly) void **ptr_bytes __attribute__((availability(macosx,unavailable))); +@end + +@interface NSMutableData +@property (nonatomic, readonly) void *mutableBytes __attribute__((deprecated)) __attribute__((unavailable)); +@end + +@interface JS +@property (nonatomic, readonly) JSObjectRef JSObject; +@property (nonatomic, readonly) TTJSObjectRef JSObject1; +@property (nonatomic, readonly) JSObjectRef *JSObject2; +@end + +// rdar://15044991 +typedef void *SecTrustRef; + +@interface NSURLProtectionSpace +@property (readonly) SecTrustRef serverTrust NS_AVAILABLE; +@property (nonatomic, readonly) void *FOO NS_AVAILABLE; +@property (readonly) void * mitTrust NS_AVAILABLE; + +@property (readonly) void * mittiTrust; + +@property (readonly) SecTrustRef XserverTrust; + +@property (nonatomic, readonly) SecTrustRef FOO1 NS_AVAILABLE; + ++ (const NSURLProtectionSpace *)ProtectionSpace; + +// pointer personality functions +@property NSUInteger (*hashFunction)(const void *item, NSUInteger (*size)(const void *item)); +@end + +@interface MustNotMigrateToInnerPointer +@property (nonatomic) void *nono; +@end