r209758 - Objective-C. Diagnose use of properties in functions nested in,

Fariborz Jahanian fjahanian at apple.com
Wed May 28 11:12:10 PDT 2014


Author: fjahanian
Date: Wed May 28 13:12:10 2014
New Revision: 209758

URL: http://llvm.org/viewvc/llvm-project?rev=209758&view=rev
Log:
Objective-C. Diagnose use of properties in functions nested in, 
now deprecated, ObjC containers instead of crashing. 
// rdar://16859666

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaPseudoObject.cpp
    cfe/trunk/test/SemaObjC/deprecate_function_containers.m

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=209758&r1=209757&r2=209758&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed May 28 13:12:10 2014
@@ -2008,6 +2008,9 @@ def note_objc_literal_comparison_isequal
   "use 'isEqual:' instead">;
 def err_attribute_argument_is_zero : Error<
   "%0 attribute must be greater than 0">;
+def err_property_function_in_objc_container : Error<
+  "use of Objective-C property in function nested in Objective-C "
+  "container not supported, move function outside its container">;
 
 let CategoryName = "Cocoa API Issue" in {
 def warn_objc_redundant_literal_use : Warning<

Modified: cfe/trunk/lib/Sema/SemaPseudoObject.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaPseudoObject.cpp?rev=209758&r1=209757&r2=209758&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaPseudoObject.cpp (original)
+++ cfe/trunk/lib/Sema/SemaPseudoObject.cpp Wed May 28 13:12:10 2014
@@ -284,6 +284,7 @@ namespace {
     bool tryBuildGetOfReference(Expr *op, ExprResult &result);
     bool findSetter(bool warn=true);
     bool findGetter();
+    bool DiagnoseUnsupportedPropertyUse();
 
     Expr *rebuildAndCaptureObject(Expr *syntacticBase) override;
     ExprResult buildGet() override;
@@ -643,6 +644,20 @@ bool ObjCPropertyOpBuilder::findSetter(b
   return false;
 }
 
+bool ObjCPropertyOpBuilder::DiagnoseUnsupportedPropertyUse() {
+  if (S.getCurLexicalContext()->isObjCContainer() &&
+      S.getCurLexicalContext()->getDeclKind() != Decl::ObjCCategoryImpl &&
+      S.getCurLexicalContext()->getDeclKind() != Decl::ObjCImplementation) {
+    if (ObjCPropertyDecl *prop = RefExpr->getExplicitProperty()) {
+        S.Diag(RefExpr->getLocation(),
+               diag::err_property_function_in_objc_container);
+        S.Diag(prop->getLocation(), diag::note_property_declare);
+        return true;
+    }
+  }
+  return false;
+}
+
 /// Capture the base object of an Objective-C property expression.
 Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) {
   assert(InstanceReceiver == nullptr);
@@ -666,6 +681,9 @@ Expr *ObjCPropertyOpBuilder::rebuildAndC
 /// Load from an Objective-C property reference.
 ExprResult ObjCPropertyOpBuilder::buildGet() {
   findGetter();
+  if (!Getter && DiagnoseUnsupportedPropertyUse())
+      return ExprError();
+
   assert(Getter);
 
   if (SyntacticRefExpr)
@@ -704,6 +722,8 @@ ExprResult ObjCPropertyOpBuilder::buildG
 ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
                                            bool captureSetValueAsResult) {
   bool hasSetter = findSetter(false);
+  if (!hasSetter && DiagnoseUnsupportedPropertyUse())
+      return ExprError();
   assert(hasSetter); (void) hasSetter;
 
   if (SyntacticRefExpr)

Modified: cfe/trunk/test/SemaObjC/deprecate_function_containers.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/deprecate_function_containers.m?rev=209758&r1=209757&r2=209758&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/deprecate_function_containers.m (original)
+++ cfe/trunk/test/SemaObjC/deprecate_function_containers.m Wed May 28 13:12:10 2014
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1  -fsyntax-only -verify -Wno-objc-root-class %s
+// RUN: %clang_cc1  -fsyntax-only -fblocks -verify -Wno-objc-root-class %s
 // rdar://10414277
 
 @protocol P
@@ -23,3 +23,15 @@ inline void v_imp_foo() {}
 @implementation I(CAT)
 void cat_imp_foo() {} 
 @end
+
+// rdar://16859666
+ at interface PrototypeState
+
+ at property (strong, readwrite) id moin1; // expected-note {{property declared here}}
+
+static inline void prototype_observe_moin1(void (^callback)(id)) { // expected-warning {{function definition inside an Objective-C container is deprecated}}
+        (void)^(PrototypeState *prototypeState){
+            callback(prototypeState.moin1); // expected-error {{use of Objective-C property in function nested in Objective-C container not supported, move function outside its container}}
+        };
+}
+ at end





More information about the cfe-commits mailing list