Some cleanup, change diagnostic when assigning to

a property which is not lvalue.

llvm-svn: 98848
This commit is contained in:
Fariborz Jahanian 2010-03-18 18:50:41 +00:00
parent 01c65a2622
commit 8342e5776e
5 changed files with 7 additions and 18 deletions

View File

@ -150,7 +150,6 @@ public:
LV_InvalidExpression,
LV_MemberFunction,
LV_SubObjCPropertySetting,
LV_SubObjCPropertyGetterSetting,
LV_ClassTemporary
};
isLvalueResult isLvalue(ASTContext &Ctx) const;
@ -182,7 +181,6 @@ public:
MLV_NoSetterProperty,
MLV_MemberFunction,
MLV_SubObjCPropertySetting,
MLV_SubObjCPropertyGetterSetting,
MLV_ClassTemporary
};
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx,

View File

@ -1952,11 +1952,7 @@ def ext_integer_complement_complex : Extension<
def error_nosetter_property_assignment : Error<
"setter method is needed to assign to object using property" " assignment syntax">;
def error_no_subobject_property_setting : Error<
"cannot assign to a sub-structure of an ivar using property"
" assignment syntax">;
def error_no_subobject_property_getter_setting : Error<
"cannot assign to a sub-structure returned via a getter using property"
" assignment syntax">;
"expression is not assignable using property assignment syntax">;
def ext_freestanding_complex : Extension<
"complex numbers are an extension in a freestanding C99 implementation">;

View File

@ -1104,11 +1104,11 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
if (m->isArrow())
return LV_Valid;
Expr *BaseExp = m->getBase();
if (BaseExp->getStmtClass() == ObjCPropertyRefExprClass)
if (BaseExp->getStmtClass() == ObjCPropertyRefExprClass ||
BaseExp->getStmtClass() == ObjCImplicitSetterGetterRefExprClass)
return LV_SubObjCPropertySetting;
return
(BaseExp->getStmtClass() == ObjCImplicitSetterGetterRefExprClass) ?
LV_SubObjCPropertyGetterSetting : BaseExp->isLvalue(Ctx);
BaseExp->isLvalue(Ctx);
}
case UnaryOperatorClass:
if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref)
@ -1324,8 +1324,6 @@ Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const {
return MLV_InvalidExpression;
case LV_MemberFunction: return MLV_MemberFunction;
case LV_SubObjCPropertySetting: return MLV_SubObjCPropertySetting;
case LV_SubObjCPropertyGetterSetting:
return MLV_SubObjCPropertyGetterSetting;
case LV_ClassTemporary:
return MLV_ClassTemporary;
}

View File

@ -5790,9 +5790,6 @@ static bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {
case Expr::MLV_SubObjCPropertySetting:
Diag = diag::error_no_subobject_property_setting;
break;
case Expr::MLV_SubObjCPropertyGetterSetting:
Diag = diag::error_no_subobject_property_getter_setting;
break;
}
SourceRange Assign;

View File

@ -15,8 +15,8 @@ typedef struct NSSize {
void foo() {
Foo *f;
f.size.width = 2.2; // expected-error {{cannot assign to a sub-structure of an ivar using property assignment syntax}}
f.size.inner.dim = 200; // expected-error {{cannot assign to a sub-structure of an ivar using property assignment syntax}}
f.size.width = 2.2; // expected-error {{expression is not assignable using property assignment syntax}}
f.size.inner.dim = 200; // expected-error {{expression is not assignable using property assignment syntax}}
}
// radar 7628953
@ -28,7 +28,7 @@ void foo() {
@implementation Gorf
- (void)MyView_sharedInit {
self.size.width = 2.2; // expected-error {{cannot assign to a sub-structure returned via a getter using property assignment syntax}}
self.size.width = 2.2; // expected-error {{expression is not assignable using property assignment syntax}}
}
- (NSSize)size {}
@end