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
This commit is contained in:
parent
a464f3d43a
commit
ec7cea925e
|
@ -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;
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue