Warn on usage of unavailable objc 'class' in

varienty of cases. // rdar://9092208

llvm-svn: 127257
This commit is contained in:
Fariborz Jahanian 2011-03-08 19:12:46 +00:00
parent cd5d3ee8c4
commit 08891f5249
3 changed files with 26 additions and 1 deletions

View File

@ -212,6 +212,7 @@ ParsedType Sema::getTypeName(IdentifierInfo &II, SourceLocation NameLoc,
}
}
} else if (ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(IIDecl)) {
(void)DiagnoseUseOfDecl(IDecl, NameLoc);
if (!HasTrailingDot)
T = Context.getObjCInterfaceType(IDecl);
}

View File

@ -868,7 +868,7 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
return ExprError();
}
assert(Class && "We don't know which class we're messaging?");
(void)DiagnoseUseOfDecl(Class, Loc);
// Find the method we are messaging.
if (!Method) {
if (Class->isForwardDecl()) {

View File

@ -0,0 +1,24 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// rdar://9092208
__attribute__((unavailable("not available")))
@interface MyClass { // expected-note 5 {{function has been explicitly marked unavailable here}}
@public
void *_test;
}
- (id)self;
- new;
+ (void)addObject:(id)anObject;
@end
int main() {
[MyClass new]; // expected-error {{'MyClass' is unavailable: not available}}
[MyClass self]; // expected-error {{'MyClass' is unavailable: not available}}
[MyClass addObject:((void *)0)]; // expected-error {{'MyClass' is unavailable: not available}}
MyClass *foo = [MyClass new]; // expected-error 2 {{'MyClass' is unavailable: not available}}
return 0;
}