diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticGroups.td | 1 | ||||
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.h | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 28 | ||||
| -rw-r--r-- | clang/test/SemaObjC/category-1.m | 2 | ||||
| -rw-r--r-- | clang/test/SemaObjC/compare-qualified-id.m | 2 | ||||
| -rw-r--r-- | clang/test/SemaObjC/method-arg-decay.m | 2 | ||||
| -rw-r--r-- | clang/test/SemaObjC/method-undef-category-warn-1.m | 4 | ||||
| -rw-r--r-- | clang/test/SemaObjC/method-undef-extension-warn-1.m | 2 | ||||
| -rw-r--r-- | clang/test/SemaObjC/no-protocol-option-tests.m | 32 | ||||
| -rw-r--r-- | clang/test/SemaObjC/undef-protocol-methods-1.m | 18 |
11 files changed, 69 insertions, 26 deletions
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 79e259dfd44..b0c016bbfd2 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -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">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 61f1048e51c..24391649d13 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 72e7f17704d..10b67460958 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -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); diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 1334e063f75..9bc0846901a 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -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()); diff --git a/clang/test/SemaObjC/category-1.m b/clang/test/SemaObjC/category-1.m index bf2aa53e8ff..18cbb83fef3 100644 --- a/clang/test/SemaObjC/category-1.m +++ b/clang/test/SemaObjC/category-1.m @@ -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'}} diff --git a/clang/test/SemaObjC/compare-qualified-id.m b/clang/test/SemaObjC/compare-qualified-id.m index f4ec2540287..08fb3668830 100644 --- a/clang/test/SemaObjC/compare-qualified-id.m +++ b/clang/test/SemaObjC/compare-qualified-id.m @@ -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 diff --git a/clang/test/SemaObjC/method-arg-decay.m b/clang/test/SemaObjC/method-arg-decay.m index e62e7f3d18f..012a3eeba0d 100644 --- a/clang/test/SemaObjC/method-arg-decay.m +++ b/clang/test/SemaObjC/method-arg-decay.m @@ -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; diff --git a/clang/test/SemaObjC/method-undef-category-warn-1.m b/clang/test/SemaObjC/method-undef-category-warn-1.m index 7f360499231..b367801242e 100644 --- a/clang/test/SemaObjC/method-undef-category-warn-1.m +++ b/clang/test/SemaObjC/method-undef-category-warn-1.m @@ -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'}} diff --git a/clang/test/SemaObjC/method-undef-extension-warn-1.m b/clang/test/SemaObjC/method-undef-extension-warn-1.m index cd31754037c..1addcf7df71 100644 --- a/clang/test/SemaObjC/method-undef-extension-warn-1.m +++ b/clang/test/SemaObjC/method-undef-extension-warn-1.m @@ -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 diff --git a/clang/test/SemaObjC/no-protocol-option-tests.m b/clang/test/SemaObjC/no-protocol-option-tests.m new file mode 100644 index 00000000000..5d2da0af48e --- /dev/null +++ b/clang/test/SemaObjC/no-protocol-option-tests.m @@ -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 diff --git a/clang/test/SemaObjC/undef-protocol-methods-1.m b/clang/test/SemaObjC/undef-protocol-methods-1.m index 6871ff06fc5..cbef3e5f4b5 100644 --- a/clang/test/SemaObjC/undef-protocol-methods-1.m +++ b/clang/test/SemaObjC/undef-protocol-methods-1.m @@ -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'}} \ |

