[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