mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-09 09:46:06 +00:00

Using the constructed name for the class properties with dot syntax may yield an inappropriate selector (i.e. if it is specified via property attributes). Prefer the declaration for the selector, falling back to the constructed name otherwise. Patch by David Herzka! llvm-svn: 295683
69 lines
1.8 KiB
Objective-C
69 lines
1.8 KiB
Objective-C
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
#if !__has_feature(objc_class_property)
|
|
#error does not support class property
|
|
#endif
|
|
|
|
@interface Root
|
|
-(id) alloc;
|
|
-(id) init;
|
|
@end
|
|
|
|
@interface A : Root {
|
|
int x;
|
|
int z;
|
|
}
|
|
@property int x;
|
|
@property int y;
|
|
@property int z;
|
|
@property(readonly) int ro, ro2;
|
|
@property (class) int c;
|
|
@property (class) int c2; // expected-note {{property declared here}} \
|
|
// expected-note {{property declared here}}
|
|
@property (class) int x;
|
|
@property (class, setter=customSet:) int customSetterProperty;
|
|
@property (class, getter=customGet) int customGetterProperty;
|
|
@end
|
|
|
|
@implementation A // expected-warning {{class property 'c2' requires method 'c2' to be defined}} \
|
|
// expected-warning {{class property 'c2' requires method 'setC2:' to be defined}}
|
|
@dynamic x; // refers to the instance property
|
|
@dynamic (class) x; // refers to the class property
|
|
@synthesize z, c2; // expected-error {{@synthesize not allowed on a class property 'c2'}}
|
|
@dynamic c; // refers to the class property
|
|
@dynamic customSetterProperty;
|
|
@dynamic customGetterProperty;
|
|
@end
|
|
|
|
int test() {
|
|
A *a = [[A alloc] init];
|
|
a.c; // expected-error {{property 'c' is a class property; did you mean to access it with class 'A'}}
|
|
return a.x + A.c;
|
|
}
|
|
|
|
void customSelectors() {
|
|
A.customSetterProperty = 1;
|
|
(void)A.customGetterProperty;
|
|
}
|
|
|
|
void message_id(id me) {
|
|
[me y];
|
|
}
|
|
|
|
void message_class(Class me) {
|
|
[me c2];
|
|
}
|
|
|
|
@interface NSObject
|
|
@end
|
|
|
|
@interface MyClass : NSObject
|
|
@property(class, readonly) int classProp; // expected-note {{property declared here}}
|
|
@end
|
|
|
|
@implementation MyClass // expected-warning {{class property 'classProp' requires method 'classProp' to be defined}}
|
|
- (int)classProp { // Oops, mistakenly made this an instance method.
|
|
return 8;
|
|
}
|
|
@end
|