]> granicus.if.org Git - clang/commitdiff
objc: warn if a readonly property has a setter attribute too.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 1 Nov 2011 23:02:16 +0000 (23:02 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 1 Nov 2011 23:02:16 +0000 (23:02 +0000)
// rdar://10357768

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

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/property-10.m

index 343ffdab1ae9b86a7fa364b9ccce493a60df5cdc..33a66a467d9a7c11d16400fe67c3af3fd49d5be6 100644 (file)
@@ -110,6 +110,7 @@ def OverlengthStrings : DiagGroup<"overlength-strings">;
 def OverloadedVirtual : DiagGroup<"overloaded-virtual">;
 def ObjCMissingSuperCalls : DiagGroup<"objc-missing-super-calls">;
 def ObjCRetainBlockProperty : DiagGroup<"objc-noncopy-retain-block-property">;
+def ObjCReadonlyPropertyHasSetter : DiagGroup<"objc-readonly-with-setter-property">;
 def ObjCContinuationPropertyType :DiagGroup<"objc-continuation-property-type">;
 def Packed : DiagGroup<"packed">;
 def Padded : DiagGroup<"padded">;
index 9041a768a7de6b1ae43d0571b5081bce6af486dd..7bfd7fb32ceb351d09c54faf24b479a8f852fef4 100644 (file)
@@ -502,6 +502,9 @@ def warn_objc_property_copy_missing_on_block : Warning<
 def warn_objc_property_retain_of_block : Warning<
     "retain'ed block property does not copy the block "
     "- use copy attribute instead">, InGroup<ObjCRetainBlockProperty>;
+def warn_objc_readonly_property_has_setter : Warning<
+    "setter cannot be specified for a readonly property">,
+    InGroup<ObjCReadonlyPropertyHasSetter>;
 def warn_atomic_property_rule : Warning<
   "writable atomic property %0 cannot pair a synthesized %select{getter|setter}1 "
   "with a user defined %select{getter|setter}2">,
index 617dbefadafdb2ce0b69639089086dc57ee84161..ae054bc629d2c7eea168f4688c36a9ae07ca4f78 100644 (file)
@@ -1798,4 +1798,9 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
            !(Attributes & ObjCDeclSpec::DQ_PR_strong) &&
            PropertyTy->isBlockPointerType())
       Diag(Loc, diag::warn_objc_property_retain_of_block);
+  
+  if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
+      (Attributes & ObjCDeclSpec::DQ_PR_setter))
+    Diag(Loc, diag::warn_objc_readonly_property_has_setter);
+      
 }
index e89d68e9d051f9b4cb7a438a613180b82ab700ee..51eb39c9e7cd660e23cbb879c263ed73c4a89f31 100644 (file)
 @property(nonatomic,copy) int (*PROP1)(); // expected-error {{property with 'copy' attribute must be of object type}}
 @property(nonatomic,weak) int (*PROP2)(); // expected-error {{property with 'weak' attribute must be of object type}}
 @end
+
+// rdar://10357768
+@interface rdar10357768
+{
+    int n1;
+}
+@property (readonly, setter=crushN1:) int n1; // expected-warning {{setter cannot be specified for a readonly property}}
+@end
+