diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-05-28 18:12:10 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-05-28 18:12:10 +0000 |
commit | 555132824a9e28993a22c1fb1933287999d5733a (patch) | |
tree | 9dd1b7f8a5546654c1b87872a1ded788f1c16977 /clang/lib | |
parent | a43e98cc741656d10643a6c70c0a9b64fa38c8a4 (diff) | |
download | bcm5719-llvm-555132824a9e28993a22c1fb1933287999d5733a.tar.gz bcm5719-llvm-555132824a9e28993a22c1fb1933287999d5733a.zip |
Objective-C. Diagnose use of properties in functions nested in,
now deprecated, ObjC containers instead of crashing.
// rdar://16859666
llvm-svn: 209758
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaPseudoObject.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaPseudoObject.cpp b/clang/lib/Sema/SemaPseudoObject.cpp index 94b19431a3e..339fe07b8cb 100644 --- a/clang/lib/Sema/SemaPseudoObject.cpp +++ b/clang/lib/Sema/SemaPseudoObject.cpp @@ -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(bool warn) { 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::rebuildAndCaptureObject(Expr *syntacticBase) { /// 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::buildGet() { ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, bool captureSetValueAsResult) { bool hasSetter = findSetter(false); + if (!hasSetter && DiagnoseUnsupportedPropertyUse()) + return ExprError(); assert(hasSetter); (void) hasSetter; if (SyntacticRefExpr) |