зеркало из https://github.com/microsoft/clang-1.git
Patch implements gcc's -Wno-protocol option to suppress warning
on unimplemented methods in protocols adopted by a class. (radar 7056600). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100028 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
db2eb5abf4
Коммит
521468391c
|
@ -116,6 +116,7 @@ def UnusedVariable : DiagGroup<"unused-variable">;
|
|||
def ReadOnlySetterAttrs : DiagGroup<"readonly-setter-attrs">;
|
||||
def Reorder : DiagGroup<"reorder">;
|
||||
def UndeclaredSelector : DiagGroup<"undeclared-selector">;
|
||||
def Protocol : DiagGroup<"protocol">;
|
||||
def SuperSubClassMismatch : DiagGroup<"super-class-method-mismatch">;
|
||||
def : DiagGroup<"variadic-macros">;
|
||||
def VariadicMacros : DiagGroup<"variadic-macros">;
|
||||
|
|
|
@ -367,6 +367,8 @@ def warn_objc_property_attr_mutually_exclusive : Warning<
|
|||
InGroup<ReadOnlySetterAttrs>, DefaultIgnore;
|
||||
def warn_undeclared_selector : Warning<
|
||||
"undeclared selector %0">, InGroup<UndeclaredSelector>, DefaultIgnore;
|
||||
def warn_unimplemented_protocol_method : Warning<
|
||||
"method in protocol not implemented">, InGroup<Protocol>;
|
||||
|
||||
// C++ declarations
|
||||
def err_static_assert_expression_is_not_constant : Error<
|
||||
|
|
|
@ -1453,7 +1453,7 @@ public:
|
|||
void ProcessDeclAttributeList(Scope *S, Decl *D, const AttributeList *AttrList);
|
||||
|
||||
void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
|
||||
bool &IncompleteImpl);
|
||||
bool &IncompleteImpl, unsigned DiagID);
|
||||
void WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethod,
|
||||
ObjCMethodDecl *IntfMethod);
|
||||
|
||||
|
|
|
@ -719,12 +719,12 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
|
|||
}
|
||||
|
||||
void Sema::WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
|
||||
bool &IncompleteImpl) {
|
||||
bool &IncompleteImpl, unsigned DiagID) {
|
||||
if (!IncompleteImpl) {
|
||||
Diag(ImpLoc, diag::warn_incomplete_impl);
|
||||
IncompleteImpl = true;
|
||||
}
|
||||
Diag(method->getLocation(), diag::note_undef_method_impl)
|
||||
Diag(method->getLocation(), DiagID)
|
||||
<< method->getDeclName();
|
||||
}
|
||||
|
||||
|
@ -815,9 +815,12 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
|
|||
ObjCMethodDecl *MethodInClass =
|
||||
IDecl->lookupInstanceMethod(method->getSelector());
|
||||
if (!MethodInClass || !MethodInClass->isSynthesized()) {
|
||||
WarnUndefinedMethod(ImpLoc, method, IncompleteImpl);
|
||||
Diag(CDecl->getLocation(), diag::note_required_for_protocol_at) <<
|
||||
PDecl->getDeclName();
|
||||
unsigned DIAG = diag::warn_unimplemented_protocol_method;
|
||||
if (Diags.getDiagnosticLevel(DIAG) != Diagnostic::Ignored) {
|
||||
WarnUndefinedMethod(ImpLoc, method, IncompleteImpl, DIAG);
|
||||
Diag(CDecl->getLocation(), diag::note_required_for_protocol_at)
|
||||
<< PDecl->getDeclName();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -829,9 +832,12 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
|
|||
if (method->getImplementationControl() != ObjCMethodDecl::Optional &&
|
||||
!ClsMap.count(method->getSelector()) &&
|
||||
(!Super || !Super->lookupClassMethod(method->getSelector()))) {
|
||||
WarnUndefinedMethod(ImpLoc, method, IncompleteImpl);
|
||||
Diag(IDecl->getLocation(), diag::note_required_for_protocol_at) <<
|
||||
PDecl->getDeclName();
|
||||
unsigned DIAG = diag::warn_unimplemented_protocol_method;
|
||||
if (Diags.getDiagnosticLevel(DIAG) != Diagnostic::Ignored) {
|
||||
WarnUndefinedMethod(ImpLoc, method, IncompleteImpl, DIAG);
|
||||
Diag(IDecl->getLocation(), diag::note_required_for_protocol_at) <<
|
||||
PDecl->getDeclName();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Check on this protocols's referenced protocols, recursively.
|
||||
|
@ -861,7 +867,8 @@ void Sema::MatchAllMethodDeclarations(const llvm::DenseSet<Selector> &InsMap,
|
|||
if (!(*I)->isSynthesized() &&
|
||||
!InsMap.count((*I)->getSelector())) {
|
||||
if (ImmediateClass)
|
||||
WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl);
|
||||
WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl,
|
||||
diag::note_undef_method_impl);
|
||||
continue;
|
||||
} else {
|
||||
ObjCMethodDecl *ImpMethodDecl =
|
||||
|
@ -885,7 +892,8 @@ void Sema::MatchAllMethodDeclarations(const llvm::DenseSet<Selector> &InsMap,
|
|||
ClsMapSeen.insert((*I)->getSelector());
|
||||
if (!ClsMap.count((*I)->getSelector())) {
|
||||
if (ImmediateClass)
|
||||
WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl);
|
||||
WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl,
|
||||
diag::note_undef_method_impl);
|
||||
} else {
|
||||
ObjCMethodDecl *ImpMethodDecl =
|
||||
IMPDecl->getClassMethod((*I)->getSelector());
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
// <rdar://problem/7249233>
|
||||
|
||||
@protocol MultipleCat_P
|
||||
-(void) im0; // expected-note {{method definition for 'im0' not found}}
|
||||
-(void) im0; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end
|
||||
|
||||
@interface MultipleCat_I @end // expected-note {{required for direct or indirect protocol 'MultipleCat_P'}}
|
||||
|
|
|
@ -5,7 +5,7 @@ typedef unsigned int NSUInteger;
|
|||
typedef struct _NSZone NSZone;
|
||||
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
|
||||
@protocol NSObject - (BOOL)isEqual:(id)object; @end
|
||||
@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end // expected-note {{method definition for 'copyWithZone:' not found}}
|
||||
@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; @end
|
||||
@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end
|
||||
@interface NSObject <NSObject> {} @end
|
||||
|
|
|
@ -56,7 +56,7 @@ PBXFindMatchContains, PBXFindMatchStartsWith, PBXFindMatchWholeWords,
|
|||
@interface PBXProjectModule : PBXModule <PBXFindableText> {
|
||||
}
|
||||
@end @class PBXBookmark;
|
||||
@protocol PBXSelectionTarget - (NSObject <PBXSelectionTarget> *) performAction:(id)action withSelection:(NSArray *)selection; // expected-note {{method definition for 'performAction:withSelection:' not found}}
|
||||
@protocol PBXSelectionTarget - (NSObject <PBXSelectionTarget> *) performAction:(id)action withSelection:(NSArray *)selection; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end @class XCPropertyDictionary, XCPropertyCondition, XCPropertyConditionSet, XCMutablePropertyConditionSet;
|
||||
extern NSMutableArray *XCFindPossibleKeyModules(PBXModule *module, BOOL useExposedModulesOnly);
|
||||
@interface NSString (StringUtilities) - (NSString *) trimToLength:(NSInteger)length preserveRange:(NSRange)range;
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
@end
|
||||
|
||||
@protocol P
|
||||
- (void) Pmeth; // expected-note {{method definition for 'Pmeth' not found}}
|
||||
- (void) Pmeth1; // expected-note {{method definition for 'Pmeth1' not found}}
|
||||
- (void) Pmeth; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
- (void) Pmeth1; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end
|
||||
|
||||
@interface MyClass1(CAT) <P> // expected-note {{required for direct or indirect protocol 'P'}}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
@protocol P
|
||||
- (void)Pmeth;
|
||||
- (void)Pmeth1; // expected-note {{method definition for 'Pmeth1' not found}}
|
||||
- (void)Pmeth1; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end
|
||||
|
||||
// Class extension
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wno-protocol -verify %s
|
||||
// rdar: // 7056600
|
||||
|
||||
@protocol P
|
||||
- PMeth;
|
||||
@end
|
||||
|
||||
// Test1
|
||||
@interface I <P> @end
|
||||
@implementation I @end // no warning with -Wno-protocol
|
||||
|
||||
// Test2
|
||||
@interface C -PMeth; @end
|
||||
@interface C (Category) <P> @end
|
||||
@implementation C (Category) @end // no warning with -Wno-protocol
|
||||
|
||||
// Test2
|
||||
@interface super - PMeth; @end
|
||||
@interface J : super <P>
|
||||
- PMeth; // expected-note {{ method definition for 'PMeth' not found}}
|
||||
@end
|
||||
@implementation J @end // expected-warning {{incomplete implementation}}
|
||||
|
||||
// Test3
|
||||
@interface K : super <P>
|
||||
@end
|
||||
@implementation K @end // no warning with -Wno-protocol
|
||||
|
||||
// Test4
|
||||
@interface Root @end
|
||||
@interface L : Root<P> @end
|
||||
@implementation L @end // no warning with -Wno-protocol
|
|
@ -1,25 +1,25 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
@protocol P1
|
||||
- (void) P1proto; // expected-note {{method definition for 'P1proto' not found}}
|
||||
+ (void) ClsP1Proto; // expected-note {{method definition for 'ClsP1Proto' not found}}
|
||||
- (void) P1proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
+ (void) ClsP1Proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
- (void) DefP1proto;
|
||||
@end
|
||||
@protocol P2
|
||||
- (void) P2proto; // expected-note {{method definition for 'P2proto' not found}}
|
||||
+ (void) ClsP2Proto; // expected-note {{method definition for 'ClsP2Proto' not found}}
|
||||
- (void) P2proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
+ (void) ClsP2Proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end
|
||||
|
||||
@protocol P3<P2>
|
||||
- (void) P3proto; // expected-note {{method definition for 'P3proto' not found}}
|
||||
+ (void) ClsP3Proto; // expected-note {{method definition for 'ClsP3Proto' not found}}
|
||||
- (void) P3proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
+ (void) ClsP3Proto; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
+ (void) DefClsP3Proto;
|
||||
@end
|
||||
|
||||
@protocol PROTO<P1, P3>
|
||||
- (void) meth; // expected-note {{method definition for 'meth' not found}}
|
||||
- (void) meth : (int) arg1; // expected-note {{method definition for 'meth:' not found}}
|
||||
+ (void) cls_meth : (int) arg1; // expected-note {{method definition for 'cls_meth:' not found}}
|
||||
- (void) meth; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
- (void) meth : (int) arg1; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
+ (void) cls_meth : (int) arg1; // expected-warning {{method in protocol not implemented [-Wprotocol]}}
|
||||
@end
|
||||
|
||||
@interface INTF <PROTO> // expected-note 3 {{required for direct or indirect protocol 'PROTO'}} \
|
||||
|
|
Загрузка…
Ссылка в новой задаче