forked from OSchip/llvm-project
objective-c: merge deprecated/unavailable attributes to
the overriding deprecated/unavailable method. // rdar://11475360 llvm-svn: 158022
This commit is contained in:
parent
4544606c71
commit
3da28f80e3
|
@ -2240,12 +2240,9 @@ bool Sema::MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old,
|
|||
|
||||
void Sema::mergeObjCMethodDecls(ObjCMethodDecl *newMethod,
|
||||
ObjCMethodDecl *oldMethod) {
|
||||
// We don't want to merge unavailable and deprecated attributes
|
||||
// except from interface to implementation.
|
||||
bool mergeDeprecation = isa<ObjCImplDecl>(newMethod->getDeclContext());
|
||||
|
||||
// Merge the attributes.
|
||||
mergeDeclAttributes(newMethod, oldMethod, mergeDeprecation);
|
||||
// Merge the attributes, including deprecated/unavailable
|
||||
mergeDeclAttributes(newMethod, oldMethod, /* mergeDeprecation */true);
|
||||
|
||||
// Merge attributes from the parameters.
|
||||
ObjCMethodDecl::param_const_iterator oi = oldMethod->param_begin(),
|
||||
|
|
|
@ -45,9 +45,9 @@ struct UnsafeS {
|
|||
};
|
||||
|
||||
@interface A : NSObject
|
||||
- (id)retain;
|
||||
- (id)retainCount;
|
||||
- (id)autorelease;
|
||||
- (id)retain; // expected-note {{declaration has been explicitly marked unavailable here}}
|
||||
- (id)retainCount; // expected-note {{declaration has been explicitly marked unavailable here}}
|
||||
- (id)autorelease; // expected-note 2 {{declaration has been explicitly marked unavailable here}}
|
||||
- (id)init;
|
||||
- (oneway void)release;
|
||||
- (void)dealloc;
|
||||
|
@ -79,7 +79,8 @@ void test1(A *a, BOOL b, struct UnsafeS *unsafeS) {
|
|||
[a.delegate release]; // expected-error {{it is not safe to remove 'retain' message on the result of a 'delegate' message; the object that was passed to 'setDelegate:' may not be properly retained}} \
|
||||
// expected-error {{ARC forbids explicit message send}}
|
||||
[unsafeS->unsafeObj retain]; // expected-error {{it is not safe to remove 'retain' message on an __unsafe_unretained type}} \
|
||||
// expected-error {{ARC forbids explicit message send}}
|
||||
// expected-error {{ARC forbids explicit message send}} \
|
||||
// expected-error {{'retain' is unavailable}}
|
||||
id foo = [unsafeS->unsafeObj retain]; // no warning.
|
||||
[global_foo retain]; // expected-error {{it is not safe to remove 'retain' message on a global variable}} \
|
||||
// expected-error {{ARC forbids explicit message send}}
|
||||
|
@ -87,12 +88,15 @@ void test1(A *a, BOOL b, struct UnsafeS *unsafeS) {
|
|||
// expected-error {{ARC forbids explicit message send}}
|
||||
[a dealloc];
|
||||
[a retain];
|
||||
[a retainCount]; // expected-error {{ARC forbids explicit message send of 'retainCount'}}
|
||||
[a retainCount]; // expected-error {{ARC forbids explicit message send of 'retainCount'}} \
|
||||
// expected-error {{'retainCount' is unavailable}}
|
||||
[a release];
|
||||
[a autorelease]; // expected-error {{it is not safe to remove an unused 'autorelease' message; its receiver may be destroyed immediately}} \
|
||||
// expected-error {{ARC forbids explicit message send}}
|
||||
// expected-error {{ARC forbids explicit message send}} \
|
||||
// expected-error {{'autorelease' is unavailable}}
|
||||
[a autorelease]; // expected-error {{it is not safe to remove an unused 'autorelease' message; its receiver may be destroyed immediately}} \
|
||||
// expected-error {{ARC forbids explicit message send}}
|
||||
// expected-error {{ARC forbids explicit message send}} \
|
||||
// expected-error {{'autorelease' is unavailable}}
|
||||
a = 0;
|
||||
|
||||
CFStringRef cfstr;
|
||||
|
|
|
@ -8,13 +8,14 @@
|
|||
- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{method 'method' declared here}}
|
||||
@end
|
||||
|
||||
// rdar://11475360
|
||||
@interface B : A
|
||||
- (void)method;
|
||||
- (void)method; // expected-note {{method 'method' declared here}}
|
||||
@end
|
||||
|
||||
void f(A *a, B *b) {
|
||||
[a method]; // expected-warning{{'method' is deprecated: first deprecated in Mac OS X 10.2}}
|
||||
[b method];
|
||||
[b method]; // expected-warning {{'method' is deprecated: first deprecated in Mac OS X 10.2}}
|
||||
[a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in Mac OS X 10.2}}
|
||||
[b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in Mac OS X 10.2}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue