]> granicus.if.org Git - clang/commitdiff
Real corener case of a method declared in a protocol
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 3 Apr 2009 21:51:32 +0000 (21:51 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 3 Apr 2009 21:51:32 +0000 (21:51 +0000)
used in a class which declares a property of the same
name. This should not result in an unimplemented
method warning.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68409 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/no-warn-synth-protocol-meth.m [new file with mode: 0644]

index fb042651f6d050195040a11d3cbdea7da4f1e22b..299f101bdbf8ba2d18ef0c55b9abb5b07be14127 100644 (file)
@@ -866,8 +866,15 @@ void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
     ObjCMethodDecl *method = *I;
     if (method->getImplementationControl() != ObjCMethodDecl::Optional && 
         !method->isSynthesized() && !InsMap.count(method->getSelector()) &&
-        (!Super || !Super->lookupInstanceMethod(method->getSelector())))
-      WarnUndefinedMethod(ImpLoc, method, IncompleteImpl);
+        (!Super || !Super->lookupInstanceMethod(method->getSelector()))) {
+        // Ugly, but necessary. Method declared in protcol might have
+        // have been synthesized due to a property declared in the class which
+        // uses the protocol.
+        ObjCMethodDecl *MethodInClass = 
+          IDecl->lookupInstanceMethod(method->getSelector());
+        if (!MethodInClass || !MethodInClass->isSynthesized())
+          WarnUndefinedMethod(ImpLoc, method, IncompleteImpl);
+      }
   }
   // check unimplemented class methods
   for (ObjCProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(), 
diff --git a/test/SemaObjC/no-warn-synth-protocol-meth.m b/test/SemaObjC/no-warn-synth-protocol-meth.m
new file mode 100644 (file)
index 0000000..860a0ca
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: clang-cc  -fsyntax-only -verify %s
+
+@protocol CYCdef
+- (int)name;
+@end
+
+@interface JSCdef <CYCdef> {
+    int name;
+}
+
+@property (assign) int name;
+@end
+
+@implementation JSCdef
+@synthesize name;
+@end
+