diff options
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index e6a7b4114a1..6a15ea68a52 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/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(); } | 

