diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-22 18:39:36 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-11-22 18:39:36 +0000 |
commit | 5daf570d0ce027e18ed5f9d66e6b2a14a40b720d (patch) | |
tree | e554d26d58de550daf74b397b4e2e894927080df /lib/AST/Expr.cpp | |
parent | e4c452c4c7b9124fe94a96f559ff077d59cdf996 (diff) |
New AST node to access "implicit" setter/getter using property dor syntax.
Issuing diagnostics when assigning to read-only properties.
This is work in progress.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59874 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Expr.cpp')
-rw-r--r-- | lib/AST/Expr.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index e6a7b4114a..6a15ea68a5 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -463,6 +463,8 @@ Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const { return LV_Valid; case ObjCPropertyRefExprClass: // FIXME: check if read-only property. return LV_Valid; + case ObjCKVCRefExprClass: // FIXME: check if read-only property. + return LV_Valid; case PredefinedExprClass: return LV_Valid; case VAArgExprClass: @@ -545,6 +547,16 @@ Expr::isModifiableLvalueResult Expr::isModifiableLvalue(ASTContext &Ctx) const { if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl())) return MLV_NotBlockQualified; } + // Assigning to a readonly property? + if (getStmtClass() == ObjCPropertyRefExprClass) { + const ObjCPropertyRefExpr* PropExpr = cast<ObjCPropertyRefExpr>(this); + if (ObjCPropertyDecl *PDecl = PropExpr->getProperty()) { + ObjCPropertyDecl::PropertyAttributeKind Pkind = + PDecl->getPropertyAttributes(); + if (Pkind == ObjCPropertyDecl::OBJC_PR_readonly) + return MLV_ReadonlyProperty; + } + } return MLV_Valid; } @@ -1353,6 +1365,10 @@ Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; } Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; } Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; } +// ObjCKVCRefExpr +Stmt::child_iterator ObjCKVCRefExpr::child_begin() { return &Base; } +Stmt::child_iterator ObjCKVCRefExpr::child_end() { return &Base+1; } + // ObjCSuperExpr Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); } Stmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); } |