summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp23
-rw-r--r--clang/test/ARCMT/objcmt-protocol-conformance.m15
-rw-r--r--clang/test/ARCMT/objcmt-protocol-conformance.m.result15
3 files changed, 44 insertions, 9 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
index dd210264582..ab4aa0e0850 100644
--- a/clang/lib/ARCMigrate/ObjCMT.cpp
+++ b/clang/lib/ARCMigrate/ObjCMT.cpp
@@ -250,17 +250,22 @@ ClassImplementsAllMethodsAndProperties(ASTContext &Ctx,
if (Property->getPropertyImplementation() == ObjCPropertyDecl::Optional)
continue;
DeclContext::lookup_const_result R = IDecl->lookup(Property->getDeclName());
- if (R.size() == 0)
- return false;
- for (unsigned I = 0, N = R.size(); I != N; ++I) {
- if (ObjCPropertyDecl *ClassProperty = dyn_cast<ObjCPropertyDecl>(R[0])) {
- if (ClassProperty->getPropertyAttributes()
- != Property->getPropertyAttributes())
- return false;
- if (!Ctx.hasSameType(ClassProperty->getType(), Property->getType()))
+ if (R.size() == 0) {
+ // Relax the rule and look into class's implementation for a synthesize
+ // or dynamic declaration. Class is implementing a property coming from
+ // another protocol. This still makes the target protocol as conforming.
+ if (!ImpDecl->FindPropertyImplDecl(
+ Property->getDeclName().getAsIdentifierInfo()))
+ return false;
+ }
+ else if (ObjCPropertyDecl *ClassProperty = dyn_cast<ObjCPropertyDecl>(R[0])) {
+ if ((ClassProperty->getPropertyAttributes()
+ != Property->getPropertyAttributes()) ||
+ !Ctx.hasSameType(ClassProperty->getType(), Property->getType()))
return false;
- }
}
+ else
+ return false;
}
// At this point, all required properties in this protocol conform to those
// declared in the class.
diff --git a/clang/test/ARCMT/objcmt-protocol-conformance.m b/clang/test/ARCMT/objcmt-protocol-conformance.m
index 2ad8a659fae..3ef2eff13f2 100644
--- a/clang/test/ARCMT/objcmt-protocol-conformance.m
+++ b/clang/test/ARCMT/objcmt-protocol-conformance.m
@@ -46,3 +46,18 @@
- (id) Meth1: (double) arg { return 0; }
@end
+// Test5 - conforms to P3 because it implement's P3's property.
+@protocol P3
+@property (copy) id Prop;
+@end
+
+@protocol P4
+@property (copy) id Prop;
+@end
+
+@interface Test5 : NSObject<P3>
+@end
+
+@implementation Test5
+@synthesize Prop=_XXX;
+@end
diff --git a/clang/test/ARCMT/objcmt-protocol-conformance.m.result b/clang/test/ARCMT/objcmt-protocol-conformance.m.result
index 71fa3b1b06d..11bf7847280 100644
--- a/clang/test/ARCMT/objcmt-protocol-conformance.m.result
+++ b/clang/test/ARCMT/objcmt-protocol-conformance.m.result
@@ -46,3 +46,18 @@
- (id) Meth1: (double) arg { return 0; }
@end
+// Test5 - conforms to P3 because it implement's P3's property.
+@protocol P3
+@property (copy) id Prop;
+@end
+
+@protocol P4
+@property (copy) id Prop;
+@end
+
+@interface Test5 : NSObject<P3, P4>
+@end
+
+@implementation Test5
+@synthesize Prop=_XXX;
+@end
OpenPOWER on IntegriCloud