Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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
- Loading branch information
Showing
10 changed files
with
140 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |