diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-09-10 22:20:09 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-09-10 22:20:09 +0000 |
commit | 4257857bf8a508b56f73f61bdf941194913bac92 (patch) | |
tree | c1bbee49ba07de5139af63fe8131842938ef0b69 /clang/test/SemaObjC | |
parent | afb8b5d95430eed2148e58c88319dded587010c5 (diff) | |
download | bcm5719-llvm-4257857bf8a508b56f73f61bdf941194913bac92.tar.gz bcm5719-llvm-4257857bf8a508b56f73f61bdf941194913bac92.zip |
[Sema][ObjC] Infer availability of +new from availability of -init.
When defined in NSObject, +new will call -init. If -init has been marked
unavailable, diagnose uses of +new.
rdar://18335828
Differential revision: https://reviews.llvm.org/D51189
llvm-svn: 341874
Diffstat (limited to 'clang/test/SemaObjC')
-rw-r--r-- | clang/test/SemaObjC/infer-availability-from-init.m | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/clang/test/SemaObjC/infer-availability-from-init.m b/clang/test/SemaObjC/infer-availability-from-init.m new file mode 100644 index 00000000000..f9996ec7087 --- /dev/null +++ b/clang/test/SemaObjC/infer-availability-from-init.m @@ -0,0 +1,58 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx-10.9 -Wunguarded-availability -fblocks -fsyntax-only -verify %s + +__attribute__((objc_root_class)) +@interface NSObject ++(instancetype)new; +-(instancetype)init; +@end + +@interface MyObject : NSObject +-(instancetype)init __attribute__((unavailable)); // expected-note{{'init' has been explicitly marked unavailable here}} +@end + +void usemyobject() { + [MyObject new]; // expected-error{{'new' is unavailable}} +} + +@interface MyOtherObject : NSObject ++(instancetype)init __attribute__((unavailable)); ++(instancetype)new; +@end + +void usemyotherobject() { + [MyOtherObject new]; // no error; new is overrideen. +} + +@interface NotGoodOverride : NSObject ++(instancetype)init __attribute__((unavailable)); +-(instancetype)new; ++(instancetype)new: (int)x; +@end + +void usenotgoodoverride() { + [NotGoodOverride new]; // no error +} + +@interface NotNSObject ++(instancetype)new; +-(instancetype)init; +@end + +@interface NotMyObject : NotNSObject +-(instancetype)init __attribute__((unavailable)); +@end + +void usenotmyobject() { + [NotMyObject new]; // no error; this isn't NSObject +} + +@interface FromSelf : NSObject +-(instancetype)init __attribute__((unavailable)); // expected-note {{'init' has been explicitly marked unavailable here}} ++(FromSelf*)another_one; +@end + +@implementation FromSelf ++(FromSelf*)another_one { + [self new]; // expected-error{{'new' is unavailable}} +} +@end |