diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-03 21:11:36 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-12-03 21:11:36 +0000 |
| commit | 22bfa2c28bdbca09949ba4cf8670c310d3e42c71 (patch) | |
| tree | 27e9efff069b7c1a7bb8b948c83913b77a67fd76 /clang/test/SemaObjC/attr-designated-init.m | |
| parent | 9ed9e5f31c1fe946a5c6c1ffb651052925570fd4 (diff) | |
| download | bcm5719-llvm-22bfa2c28bdbca09949ba4cf8670c310d3e42c71.tar.gz bcm5719-llvm-22bfa2c28bdbca09949ba4cf8670c310d3e42c71.zip | |
[objc] Emit a warning when the implementation of a designated initializer does not chain to
an init method that is a designated initializer for the superclass.
llvm-svn: 196316
Diffstat (limited to 'clang/test/SemaObjC/attr-designated-init.m')
| -rw-r--r-- | clang/test/SemaObjC/attr-designated-init.m | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/clang/test/SemaObjC/attr-designated-init.m b/clang/test/SemaObjC/attr-designated-init.m index f607bb69447..3190d8a97fe 100644 --- a/clang/test/SemaObjC/attr-designated-init.m +++ b/clang/test/SemaObjC/attr-designated-init.m @@ -30,3 +30,99 @@ __attribute__((objc_root_class)) -(id)init3 { return 0; } -(id)init4 NS_DESIGNATED_INITIALIZER { return 0; } // expected-error {{only applies to methods of interface declarations}} @end + +__attribute__((objc_root_class)) +@interface B1 +-(id)initB1 NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}} +-(id)initB2; +-(id)initB3 NS_DESIGNATED_INITIALIZER; +@end + +@implementation B1 +-(id)initB1 { return 0; } +-(id)initB2 { return 0; } +-(id)initB3 { return 0; } +@end + +@interface S1 : B1 +-(id)initS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}} +-(id)initS2 NS_DESIGNATED_INITIALIZER; +-(id)initS3 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}} +-(id)initS4 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}} +-(id)initB1; +@end + +@implementation S1 +-(id)initS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return 0; +} +-(id)initS2 { + return [super initB1]; +} +-(id)initS3 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return [super initB2]; +} +-(id)initS4 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return [self initB1]; +} +-(id)initB1 { + return [self initS1]; +} +-(id)initB3 { + return [self initS1]; +} +@end + +@interface S2 : B1 +-(id)initB1; +@end + +@interface SS2 : S2 +-(id)initSS1 NS_DESIGNATED_INITIALIZER; +@end + +@implementation SS2 +-(id)initSS1 { + return [super initB1]; +} +@end + +@interface S3 : B1 +-(id)initS1 NS_DESIGNATED_INITIALIZER; +@end + +@interface SS3 : S3 +-(id)initSS1 NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}} +@end + +@implementation SS3 +-(id)initSS1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return [super initB1]; +} +@end + +@interface S4 : B1 +-(id)initB1; +-(id)initB3; +@end + +@implementation S4 +-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return 0; +} +-(id)initB3 { + return [super initB3]; +} +@end + +@interface S5 : B1 +@end + +@implementation S5 +-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}} + return 0; +} +-(id)initB3 { + return [super initB3]; +} +@end |

