]> granicus.if.org Git - clang/commitdiff
objective-c - Make warning on unimplemented protocols point
authorFariborz Jahanian <fjahanian@apple.com>
Sat, 27 Aug 2011 21:55:47 +0000 (21:55 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sat, 27 Aug 2011 21:55:47 +0000 (21:55 +0000)
to class implementation where it is supposed to be
implemented. // rdar://10009982.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/default-synthesize.m
test/SemaObjC/property-category-1.m
test/SemaObjC/property-category-2.m
test/SemaObjC/property-category-impl.m
test/SemaObjC/property.m
test/SemaObjC/super-class-protocol-conformance.m
test/SemaObjC/unimplemented-protocol-prop.m

index 8b39c782f28bfb0028c73033690c05e5a2035cea..d5b3ac3ac32956ac13cc0065765b242326d678e4 100644 (file)
@@ -3372,10 +3372,11 @@ def err_incomplete_type_objc_at_encode : Error<
 
 def warn_setter_getter_impl_required : Warning<
   "property %0 requires method %1 to be defined - "
-  "use @synthesize, @dynamic or provide a method implementation">;
+  "use @synthesize, @dynamic or provide a method implementation "
+  "in this class implementation">;
 def warn_setter_getter_impl_required_in_category : Warning<
   "property %0 requires method %1 to be defined - "
-  "use @dynamic or provide a method implementation in category">;
+  "use @dynamic or provide a method implementation in this category">;
 def note_property_impl_required : Note<
   "implementation is here">;
 def note_parameter_named_here : Note<
index 4b9cd66f96e9e1ad76f1371d7cf1de330ec6c158..f4743acec50d62534930c20836bbde801742c271 100644 (file)
@@ -1316,23 +1316,23 @@ void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
         PropImplMap.count(Prop) || Prop->hasAttr<UnavailableAttr>())
       continue;
     if (!InsMap.count(Prop->getGetterName())) {
-      Diag(Prop->getLocation(),
+      Diag(IMPDecl->getLocation(),
            isa<ObjCCategoryDecl>(CDecl) ?
             diag::warn_setter_getter_impl_required_in_category :
             diag::warn_setter_getter_impl_required)
       << Prop->getDeclName() << Prop->getGetterName();
-      Diag(IMPDecl->getLocation(),
-           diag::note_property_impl_required);
+      Diag(Prop->getLocation(),
+           diag::note_property_declare);
     }
 
     if (!Prop->isReadOnly() && !InsMap.count(Prop->getSetterName())) {
-      Diag(Prop->getLocation(),
+      Diag(IMPDecl->getLocation(),
            isa<ObjCCategoryDecl>(CDecl) ?
            diag::warn_setter_getter_impl_required_in_category :
            diag::warn_setter_getter_impl_required)
       << Prop->getDeclName() << Prop->getSetterName();
-      Diag(IMPDecl->getLocation(),
-           diag::note_property_impl_required);
+      Diag(Prop->getLocation(),
+           diag::note_property_declare);
     }
   }
 }
index 33e3bd6f346458a3295052c4dd413ac1cc354d48..c9454d26997e73b13ec4775326eabac922d165ee 100644 (file)
 // rdar://7920807
 @interface C @end
 @interface C (Category)
-@property int p; // expected-warning {{property 'p' requires method 'p' to be defined }} \
-                 // expected-warning {{property 'p' requires method 'setP:' to be defined}}
+@property int p; // expected-note 2 {{property declared here}}
 @end
-@implementation C (Category) // expected-note 2 {{implementation is here}}
+@implementation C (Category) // expected-warning {{property 'p' requires method 'p' to be defined}} \
+                             // expected-warning {{property 'p' requires method 'setP:' to be defined}}
 @end
 
 // Don't complain if a property is already @synthesized by usr.
index 26e73136d01f96f3cab634ae689c217c04df4382..6382826080fb993c883fc0b76c5afed7e59a26d5 100644 (file)
@@ -37,7 +37,7 @@ int main(int argc, char **argv) {
 ///
 
 @interface I0
-@property(readonly) int p0;    // expected-warning {{property 'p0' requires method 'p0' to be defined}}
+@property(readonly) int p0;    // expected-note {{property declared here}}
 @end 
 
 @interface I0 (Cat0)
@@ -46,7 +46,7 @@ int main(int argc, char **argv) {
 @interface I0 (Cat1)
 @end 
   
-@implementation I0     // expected-note {{implementation is here}}
+@implementation I0     // expected-warning {{property 'p0' requires method 'p0' to be define}}
 - (void) foo {
   self.p0 = 0; // expected-error {{assigning to property with 'readonly' attribute not allowed}}
 }
index e63672bb0ad7965fef7da95213759f8b3bfd887f..ecc368162bfaad8d86bbb5a9ca9f32f852f2e978 100644 (file)
@@ -4,8 +4,7 @@
 
 @protocol MyProtocol
 @property float  myFloat;
-@property float  anotherFloat; // expected-warning {{property 'anotherFloat' requires method 'anotherFloat' to be defined - use @dynamic}} \
-                               // expected-warning {{property 'anotherFloat' requires method 'setAnotherFloat:' to be defined }}
+@property float  anotherFloat; // expected-note 2 {{property declared}}
 @end
 
 @interface MyObject { float anotherFloat; }
@@ -14,7 +13,8 @@
 @interface MyObject (CAT) <MyProtocol>
 @end
 
-@implementation MyObject (CAT) // expected-note 2 {{implementation is here}}
+@implementation MyObject (CAT) // expected-warning  {{property 'anotherFloat' requires method}} \
+                                // expected-warning {{property 'anotherFloat' requires method 'setAnotherFloat:'}}
 @dynamic myFloat;      // OK
 @synthesize anotherFloat; // expected-error {{@synthesize not allowed in a category's implementation}}
 @end
index 997949778c6e3208eafc36eb9774a3856a6769e9..21fdf1b6d4bee3a02df17fca3c296e7b16f71e68 100644 (file)
@@ -24,8 +24,8 @@
 @end
 
 @interface MyClass (public)
-@property(readwrite)    int        foo;        // expected-warning {{property 'foo' requires method 'setFoo:' to be defined }}
+@property(readwrite)    int        foo;        // expected-note {{property declared here}}
 @end
 
-@implementation MyClass (public)// expected-note {{implementation is here}}
+@implementation MyClass (public)// expected-warning {{property 'foo' requires method 'setFoo:' to be defined }}
 @end 
index 4d00bd2b522d99bc0f0ed8fe2a1e0d20de6edc5c..62291bb98cf21fac7f6a69d6cd8fbc8630e5d7f4 100644 (file)
@@ -11,8 +11,7 @@
 @end
 
 @interface I(CAT)
-@property int d1;      // expected-warning {{property 'd1' requires method 'd1' to be defined }} \
-                       // expected-warning {{property 'd1' requires method 'setD1:' to be defined }}
+@property int d1;      // expected-note 2 {{property declared here}}
 @end
 
 @implementation I
@@ -23,7 +22,8 @@
 @synthesize name;      // OK! property with same name as an accessible ivar of same name
 @end
 
-@implementation I(CAT)  // expected-note 2 {{implementation is here}}
+@implementation I(CAT)  // expected-warning {{property 'd1' requires method 'd1' to be defined }} \
+                        // expected-warning {{property 'd1' requires method 'setD1:' to be defined }}
 @synthesize d1;                // expected-error {{@synthesize not allowed in a category's implementation}}
 @dynamic bad;          // expected-error {{property implementation must have its declaration in the category 'CAT'}}
 @end
index bf19c837f46a240cc4f8e96d9e8ad0e7bd37bbc3..32d5392ad4e067272c86113a8afbf4328cc98712 100644 (file)
@@ -4,7 +4,7 @@
 @interface NSObject @end
 
 @protocol TopProtocol
-  @property (readonly) id myString; // expected-warning {{property 'myString' requires method 'myString' to be defined}}
+  @property (readonly) id myString; // expected-note {{property}}
 @end
 
 @protocol SubProtocol <TopProtocol>
@@ -21,7 +21,7 @@
 
 @implementation SubClass1 @end // Test1 - No Warning
 
-@implementation TopClass  // expected-note {{implementation is here}}
+@implementation TopClass  // expected-warning {{property 'myString' requires method 'myString' to be defined}}
 @end
 
 @implementation SubClass // Test3 - No Warning 
 @implementation SubClass4 @end // Test 5 - No Warning
 
 @protocol NewProtocol
-  @property (readonly) id myNewString; // expected-warning {{property 'myNewString' requires method 'myNewString' to be defined}}
+  @property (readonly) id myNewString;  // expected-note {{property}}
 @end
 
 @interface SubClass5 : SubClass4 <NewProtocol> @end
-@implementation SubClass5 @end   // expected-note {{implementation is here}}
+@implementation SubClass5 @end   // expected-warning {{property 'myNewString' requires method 'myNewString' to be defined}}
 
 
 // Radar 8035776
 @end
 
 @protocol ProtocolWithProperty <SuperProtocol>
-@property (readonly, assign) id invalidationBacktrace; // expected-warning {{property 'invalidationBacktrace' requires method 'invalidationBacktrace' to be defined}}
+@property (readonly, assign) id invalidationBacktrace; // expected-note {{property}}
 @end
 
 @interface INTF : Super <ProtocolWithProperty> 
 @end
 
-@implementation INTF @end // expected-note {{implementation is here}}
+@implementation INTF @end // expected-warning{{property 'invalidationBacktrace' requires method 'invalidationBacktrace' to be defined}}
index d3de50efea583960e3dc6faf261b22868e9ecd50..0805202c5e09203a1b9f5bf946c3f0c47b5c1e4b 100644 (file)
@@ -2,14 +2,12 @@
 
 @protocol PROTOCOL0
 @required
-@property float MyProperty0; // expected-warning {{property 'MyProperty0' requires method 'MyProperty0' to be defined }} \
-                            // expected-warning {{property 'MyProperty0' requires method 'setMyProperty0:' to be defined}}
+@property float MyProperty0; // expected-note 2 {{property declared}}
 @end
 
 @protocol PROTOCOL<PROTOCOL0>
 @required
-@property float MyProperty; // expected-warning {{property 'MyProperty' requires method 'MyProperty' to be defined}} \
-                       // expected-warning {{property 'MyProperty' requires method 'setMyProperty:' to be defined}}
+@property float MyProperty; // expected-note 2 {{property declared}}
 @optional
 @property float OptMyProperty;
 @end
@@ -17,4 +15,7 @@
 @interface I <PROTOCOL>
 @end
 
-@implementation I @end // expected-note 4 {{implementation is here}}
+@implementation I @end // expected-warning {{property 'MyProperty0' requires method 'MyProperty0' to be defined}} \
+                       // expected-warning {{property 'MyProperty0' requires method 'setMyProperty0:' to be defined}}\
+                       // expected-warning {{property 'MyProperty' requires method 'MyProperty' to be defined}} \
+                       // expected-warning {{property 'MyProperty' requires method 'setMyProperty:' to be defined}}