forked from OSchip/llvm-project
Objective-C: check that when a category method is being implemented,
method type in cateogry matches the implementation. // rdar://12519216 llvm-svn: 166518
This commit is contained in:
parent
8e95113597
commit
6f5309cf50
|
@ -1709,14 +1709,26 @@ void Sema::MatchAllMethodDeclarations(const SelectorSet &InsMap,
|
|||
}
|
||||
|
||||
if (ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl> (CDecl)) {
|
||||
// Also methods in class extensions need be looked at next.
|
||||
for (const ObjCCategoryDecl *ClsExtDecl = I->getFirstClassExtension();
|
||||
ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension())
|
||||
MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
|
||||
IMPDecl,
|
||||
const_cast<ObjCCategoryDecl *>(ClsExtDecl),
|
||||
IncompleteImpl, false,
|
||||
WarnCategoryMethodImpl);
|
||||
// when checking that methods in implementation match their declaration,
|
||||
// i.e. when WarnCategoryMethodImpl is false, check declarations in class
|
||||
// extension; as well as those in categories.
|
||||
if (!WarnCategoryMethodImpl)
|
||||
for (const ObjCCategoryDecl *CDeclChain = I->getCategoryList();
|
||||
CDeclChain; CDeclChain = CDeclChain->getNextClassCategory())
|
||||
MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
|
||||
IMPDecl,
|
||||
const_cast<ObjCCategoryDecl *>(CDeclChain),
|
||||
IncompleteImpl, false,
|
||||
WarnCategoryMethodImpl);
|
||||
else
|
||||
// Also methods in class extensions need be looked at next.
|
||||
for (const ObjCCategoryDecl *ClsExtDecl = I->getFirstClassExtension();
|
||||
ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension())
|
||||
MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
|
||||
IMPDecl,
|
||||
const_cast<ObjCCategoryDecl *>(ClsExtDecl),
|
||||
IncompleteImpl, false,
|
||||
WarnCategoryMethodImpl);
|
||||
|
||||
// Check for any implementation of a methods declared in protocol.
|
||||
for (ObjCInterfaceDecl::all_protocol_iterator
|
||||
|
|
|
@ -34,3 +34,18 @@
|
|||
(float) x { return 0; } // expected-warning {{conflicting parameter types in implementation of 'setCat:': 'int' vs 'float'}}
|
||||
+ (int) cCat: (int) x { return 0; } // expected-warning {{conflicting return type in implementation of 'cCat:': 'void' vs 'int'}}
|
||||
@end
|
||||
|
||||
// rdar://12519216
|
||||
// test that when implementation implements method in a category, types match.
|
||||
@interface testObject {}
|
||||
@end
|
||||
|
||||
@interface testObject(Category)
|
||||
- (float)returnCGFloat; // expected-note {{previous definition is here}}
|
||||
@end
|
||||
|
||||
@implementation testObject
|
||||
- (double)returnCGFloat { // expected-warning {{conflicting return type in implementation of 'returnCGFloat': 'float' vs 'double'}}
|
||||
return 0.0;
|
||||
}
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue