forked from OSchip/llvm-project
-Wselector should warn on implemented selectors only
when selector metadata is generated, which is triggered by at least on class implementation. This is to match gcc's behavior. // rdar://8851684. llvm-svn: 124909
This commit is contained in:
parent
191524e8a5
commit
c9b7c209bb
|
@ -1381,6 +1381,11 @@ public:
|
|||
/// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists.
|
||||
ObjCCategoryImplDecl *getObjCImplementation(ObjCCategoryDecl *D);
|
||||
|
||||
/// \brief returns true if there is at lease one @implementation in TU.
|
||||
bool AnyObjCImplementation() {
|
||||
return !ObjCImpls.empty();
|
||||
}
|
||||
|
||||
/// \brief Set the implementation of ObjCInterfaceDecl.
|
||||
void setObjCImplementation(ObjCInterfaceDecl *IFaceD,
|
||||
ObjCImplementationDecl *ImplD);
|
||||
|
|
|
@ -1994,7 +1994,11 @@ void ObjCImplementationDecl::setIvarInitializers(ASTContext &C,
|
|||
}
|
||||
|
||||
void Sema::DiagnoseUseOfUnimplementedSelectors() {
|
||||
if (ReferencedSelectors.empty())
|
||||
// Warning will be issued only when selector table is
|
||||
// generated (which means there is at lease one implementation
|
||||
// in the TU). This is to match gcc's behavior.
|
||||
if (ReferencedSelectors.empty() ||
|
||||
!Context.AnyObjCImplementation())
|
||||
return;
|
||||
for (llvm::DenseMap<Selector, SourceLocation>::iterator S =
|
||||
ReferencedSelectors.begin(),
|
||||
|
|
|
@ -1,35 +1,29 @@
|
|||
// RUN: %clang_cc1 -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wselector -verify %s
|
||||
// rdar://8851684
|
||||
|
||||
@interface Lancelot @end
|
||||
@implementation Lancelot
|
||||
@interface Foo
|
||||
- (void) foo;
|
||||
- (void) bar;
|
||||
@end
|
||||
|
||||
- (void):(int)x {}
|
||||
- (void)xx:(int)x :(int)y { }
|
||||
@implementation Foo
|
||||
- (void) bar
|
||||
{
|
||||
}
|
||||
|
||||
- (void) foo
|
||||
{
|
||||
SEL a,b,c;
|
||||
a = @selector(b1ar); // expected-warning {{unimplemented selector 'b1ar'}}
|
||||
b = @selector(bar);
|
||||
}
|
||||
@end
|
||||
|
||||
@interface I
|
||||
- (id) compare: (char) arg1;
|
||||
- length;
|
||||
@end
|
||||
|
||||
@interface J
|
||||
- (id) compare: (id) arg1;
|
||||
@end
|
||||
|
||||
SEL foo()
|
||||
SEL func()
|
||||
{
|
||||
return @selector(compare:); // Non warning on multiple selector found.
|
||||
}
|
||||
|
||||
int main() {
|
||||
SEL s = @selector(retain);
|
||||
SEL s1 = @selector(meth1:);
|
||||
SEL s2 = @selector(retainArgument::);
|
||||
SEL s3 = @selector(retainArgument:::::);
|
||||
SEL s4 = @selector(retainArgument:with:);
|
||||
SEL s5 = @selector(meth1:with:with:);
|
||||
SEL s6 = @selector(getEnum:enum:bool:);
|
||||
SEL s7 = @selector(char:float:double:unsigned:short:long:);
|
||||
|
||||
SEL s9 = @selector(:enum:bool:);
|
||||
return @selector(length); // expected-warning {{unimplemented selector 'length'}}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wselector -verify %s
|
||||
// rdar://8851684
|
||||
@interface I
|
||||
- length;
|
||||
@end
|
||||
|
||||
static inline SEL IsEmpty() {
|
||||
return @selector(length);
|
||||
}
|
||||
|
||||
int main (int argc, const char * argv[]) {
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue