[cfe-commits] r157121 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaObjCProperty.cpp test/SemaObjC/iboutlet.m

Fariborz Jahanian fjahanian at apple.com
Sat May 19 11:17:17 PDT 2012


Author: fjahanian
Date: Sat May 19 13:17:17 2012
New Revision: 157121

URL: http://llvm.org/viewvc/llvm-project?rev=157121&view=rev
Log:
objective-c: Warn if default synthesizing readonly IBOutlet properties
and provide a 'fixit' to change 'readonly' to 'readwrite'. 'fixit'
part needs little more work. // rdar://11448209

Added:
    cfe/trunk/test/SemaObjC/iboutlet.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaObjCProperty.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=157121&r1=157120&r2=157121&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat May 19 13:17:17 2012
@@ -711,6 +711,12 @@
   "undeclared selector %0">, InGroup<UndeclaredSelector>, DefaultIgnore;
 def warn_implicit_atomic_property : Warning<
   "property is assumed atomic by default">, InGroup<ImplicitAtomic>, DefaultIgnore;
+def note_auto_readonly_iboutlet_fixup_suggest : Note<
+  "readonly IBOutlet property should be changed to be readwrite">;
+def warn_auto_readonly_iboutlet_property : Warning<
+  "readonly IBOutlet property when auto-synthesized may "
+  "not work correctly with 'nib' loader">,
+  InGroup<DiagGroup<"readonly-iboutlet-property">>;
 def warn_auto_implicit_atomic_property : Warning<
   "property is assumed atomic when auto-synthesizing the property">, 
   InGroup<ImplicitAtomic>, DefaultIgnore;

Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=157121&r1=157120&r2=157121&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original)
+++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Sat May 19 13:17:17 2012
@@ -200,6 +200,53 @@
   return (ObjCPropertyDecl::PropertyAttributeKind)attributesAsWritten;
 }
 
+static std::string getPropertyAttributeString(const ObjCPropertyDecl *property,
+                                              unsigned Attributes) {
+  std::string attr;
+  if (!Attributes)
+    return attr;
+  attr = "(";
+  bool first = true;
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_readonly)
+    {attr +=  !first ? ", readonly" : "readonly"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_readwrite)
+    {attr +=  !first ? ", readwrite" : "readwrite"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_getter)
+    {
+      if (!first)
+        attr += ", ";
+      attr += "getter=";
+      attr += property->getGetterName().getAsString();
+      first = false;
+   }
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_setter)
+    {
+      if (!first)
+        attr += ", ";
+      attr += "setter=";
+      attr += property->getSetterName().getAsString();
+      first = false;
+   }
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_assign)
+    {attr +=  !first ? ", assign" : "assign"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_retain)
+    {attr +=  !first ? ", retain" : "retain"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_strong)
+    {attr +=  !first ? ", strong" : "strong"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_weak)
+    {attr +=  !first ? ", weak" : "weak"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_copy)
+    {attr +=  !first ? ", copy" : "copy"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
+    {attr +=  !first ? ", unsafe_unretained" : "unsafe_unretained"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic)
+    {attr +=  !first ? ", nonatomic" : "nonatomic"; first = false; } 
+  if (Attributes & ObjCPropertyDecl::OBJC_PR_atomic)
+    {attr +=  !first ? ", atomic" : "atomic"; first = false; } 
+  attr += ")";
+  return attr;
+}
+
 Decl *
 Sema::HandlePropertyInClassExtension(Scope *S,
                                      SourceLocation AtLoc,
@@ -628,6 +675,26 @@
         return 0;
       }
     }
+    
+    if (Synthesize&&
+        (PIkind & ObjCPropertyDecl::OBJC_PR_readonly) &&
+        property->hasAttr<IBOutletAttr>() &&
+        !AtLoc.isValid()) {
+      unsigned rwPIKind = (PIkind | ObjCPropertyDecl::OBJC_PR_readwrite);
+      rwPIKind &= (~ObjCPropertyDecl::OBJC_PR_readonly);
+      Diag(IC->getLocation(), diag::warn_auto_readonly_iboutlet_property);
+      Diag(property->getLocation(), diag::note_property_declare);
+      // FIXME. End location must be that of closing ')' which is currently
+      // unavailable. Need to add it.
+      SourceLocation endLoc =
+              property->getTypeSourceInfo()->getTypeLoc().getBeginLoc();
+      SourceRange PropSourceRange(property->getLParenLoc(), endLoc);
+      Diag(property->getLocation(), 
+           diag::note_auto_readonly_iboutlet_fixup_suggest) <<
+      FixItHint::CreateReplacement(PropSourceRange, getPropertyAttributeString(property,
+                                                                               rwPIKind));
+    }
+        
   } else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) {
     if (Synthesize) {
       Diag(AtLoc, diag::error_synthesize_category_decl);

Added: cfe/trunk/test/SemaObjC/iboutlet.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/iboutlet.m?rev=157121&view=auto
==============================================================================
--- cfe/trunk/test/SemaObjC/iboutlet.m (added)
+++ cfe/trunk/test/SemaObjC/iboutlet.m Sat May 19 13:17:17 2012
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only -fobjc-default-synthesize-properties  -verify %s
+// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -fobjc-default-synthesize-properties  -verify %s
+// rdar://11448209
+
+ at class NSView;
+
+#define IBOutlet __attribute__((iboutlet))
+
+ at interface I
+ at property (getter = MyGetter, readonly, assign) IBOutlet NSView *myView; // expected-note {{property declared here}} \
+							// expected-note {{readonly IBOutlet property should be changed to be readwrite}}
+ at end
+
+ at implementation I // expected-warning {{readonly IBOutlet property when auto-synthesized may not work correctly with 'nib' loader}}
+ at end





More information about the cfe-commits mailing list