forked from OSchip/llvm-project
objective-c: Any use of @synthesize or @dynamic lexically after a method (or C function) implementation
will be rejected with a compilation error in ARC mode, and a compiler warning otherwise. This may cause breakage in non-arc (and arc) tests which don't expect warning/error. Feel free to fix the tests, or reverse the patch, if I am unavailable. // rdar://9818354 - WIP llvm-svn: 135740
This commit is contained in:
parent
959b7e9df7
commit
dff8de77a6
|
@ -464,6 +464,10 @@ def err_continuation_class : Error<"continuation class has no primary class">;
|
|||
def err_property_type : Error<"property cannot have array or function type %0">;
|
||||
def error_missing_property_context : Error<
|
||||
"missing context for property implementation declaration">;
|
||||
def error_property_after_method_impl : Error<
|
||||
"property implementation declaration after method or function definition">;
|
||||
def warn_property_after_method_impl : Warning<
|
||||
"property implementation declaration after method or function definition">;
|
||||
def error_bad_property_decl : Error<
|
||||
"property implementation must have its declaration in interface %0">;
|
||||
def error_category_property : Error<
|
||||
|
|
|
@ -555,6 +555,14 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
if ((IC->meth_begin() != IC->meth_end()) && AtLoc.isValid()) {
|
||||
if (getLangOptions().ObjCAutoRefCount)
|
||||
Diag(AtLoc, diag::error_property_after_method_impl);
|
||||
else
|
||||
Diag(AtLoc, diag::warn_property_after_method_impl);
|
||||
ObjCMethodDecl *method = *(IC->meth_begin());
|
||||
Diag(method->getLocation(), diag::note_method_declared_at);
|
||||
}
|
||||
} else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) {
|
||||
if (Synthesize) {
|
||||
Diag(AtLoc, diag::error_synthesize_category_decl);
|
||||
|
|
|
@ -34,11 +34,11 @@
|
|||
@end
|
||||
|
||||
@implementation Bar
|
||||
@synthesize a;
|
||||
- (void) dealloc {
|
||||
[self setA:0]; // This is user-defined setter overriding synthesize, don't touch it.
|
||||
self.a.x = 0; // every dealloc must zero out its own ivar. This patter is not recognized.
|
||||
}
|
||||
@synthesize a;
|
||||
- (void) setA:(Foo*) val { }
|
||||
- (id) a {return 0;}
|
||||
@end
|
||||
|
|
|
@ -29,11 +29,11 @@
|
|||
@end
|
||||
|
||||
@implementation Bar
|
||||
@synthesize a;
|
||||
- (void) dealloc {
|
||||
[self setA:0]; // This is user-defined setter overriding synthesize, don't touch it.
|
||||
self.a.x = 0; // every dealloc must zero out its own ivar. This patter is not recognized.
|
||||
}
|
||||
@synthesize a;
|
||||
- (void) setA:(Foo*) val { }
|
||||
- (id) a {return 0;}
|
||||
@end
|
||||
|
|
|
@ -598,9 +598,9 @@ int Test33(id someid) {
|
|||
@synthesize newName;
|
||||
|
||||
@synthesize newName1;
|
||||
- (id) newName1 { return 0; }
|
||||
- (id) newName1 { return 0; } // expected-note {{method declared here}}
|
||||
|
||||
@synthesize newName2;
|
||||
@synthesize newName2; // expected-error {{property implementation declaration after method or function definition}}
|
||||
@end
|
||||
|
||||
void test35(void) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// XFAIL: *
|
||||
|
||||
/*
|
||||
Conditions for warning:
|
||||
|
|
|
@ -15,8 +15,13 @@ int glob;
|
|||
// rdar://9027673
|
||||
// Warning on future name lookup rule is removed.
|
||||
@implementation I
|
||||
- (int) Meth { return glob; } // no warning
|
||||
@synthesize glob;
|
||||
@dynamic p;
|
||||
@dynamic le;
|
||||
@dynamic l;
|
||||
@dynamic ls;
|
||||
@dynamic r;
|
||||
- (int) Meth { return glob; } // no warning
|
||||
// rdar://8248681
|
||||
- (int) Meth1: (int) p {
|
||||
extern int le;
|
||||
|
@ -26,11 +31,6 @@ int glob;
|
|||
p = le + ls + r;
|
||||
return l;
|
||||
}
|
||||
@dynamic p;
|
||||
@dynamic le;
|
||||
@dynamic l;
|
||||
@dynamic ls;
|
||||
@dynamic r;
|
||||
@end
|
||||
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@
|
|||
@end
|
||||
|
||||
@implementation D
|
||||
- (int) Meth { return self.PROP; }
|
||||
@synthesize PROP=IVAR;
|
||||
- (int) Meth { return self.PROP; }
|
||||
@end
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
@synthesize newName;
|
||||
|
||||
@synthesize newName1;
|
||||
@synthesize newName2;
|
||||
- (id) newName1 { return 0; }
|
||||
|
||||
@synthesize newName2;
|
||||
@end
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
@synthesize foo = _foo;
|
||||
@synthesize foo1;
|
||||
|
||||
- (void)setFoo:(int)value {
|
||||
- (void)setFoo:(int)value { // expected-note 3 {{method declared here}}
|
||||
_foo = foo; // expected-error {{use of undeclared identifier 'foo'}}
|
||||
}
|
||||
|
||||
|
@ -31,10 +31,10 @@
|
|||
_foo = foo3; // OK
|
||||
}
|
||||
|
||||
@synthesize foo2 = _foo2;
|
||||
@synthesize foo3;
|
||||
@synthesize foo2 = _foo2; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
@synthesize foo3; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
|
||||
@synthesize PROP=PROP;
|
||||
@synthesize PROP=PROP; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
- (void)setPROP:(int)value {
|
||||
PROP = PROP; // OK
|
||||
}
|
||||
|
|
|
@ -18,22 +18,23 @@ int bar;
|
|||
@end
|
||||
|
||||
@implementation I
|
||||
- (int) Meth { return PROP; } // expected-note 2{{'PROP' declared here}}
|
||||
- (int) Meth { return PROP; } // expected-note 2{{'PROP' declared here}} \
|
||||
// expected-note 5{{method declared here}}
|
||||
|
||||
@dynamic PROP1;
|
||||
@dynamic PROP1; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
- (int) Meth1 { return PROP1; } // expected-error {{use of undeclared identifier 'PROP1'}}
|
||||
|
||||
- (int) Meth2 { return PROP2; } // expected-error {{use of undeclared identifier 'PROP2'}}
|
||||
@dynamic PROP2;
|
||||
@dynamic PROP2; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
|
||||
- (int) Meth3 { return PROP3; } // expected-error {{use of undeclared identifier 'PROP3'}}
|
||||
@synthesize PROP3=IVAR;
|
||||
@synthesize PROP3=IVAR; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
|
||||
- (int) Meth4 { return PROP4; }
|
||||
@synthesize PROP4=PROP4;
|
||||
@synthesize PROP4=PROP4; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
|
||||
- (int) Meth5 { return bar; } // expected-error {{use of undeclared identifier 'bar'}}
|
||||
@synthesize bar = _bar;
|
||||
@synthesize bar = _bar; // expected-warning {{property implementation declaration after method or function definition}}
|
||||
|
||||
- (int) Meth6 { return bar1; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue