Diagnose when user provided getter is being used as lvalue
using property dot-syntax. Fixes radar 7628953. llvm-svn: 95838
This commit is contained in:
parent
e0913883b7
commit
13b9782cc0
|
@ -149,7 +149,8 @@ public:
|
|||
LV_DuplicateVectorComponents,
|
||||
LV_InvalidExpression,
|
||||
LV_MemberFunction,
|
||||
LV_SubObjCPropertySetting
|
||||
LV_SubObjCPropertySetting,
|
||||
LV_SubObjCPropertyGetterSetting
|
||||
};
|
||||
isLvalueResult isLvalue(ASTContext &Ctx) const;
|
||||
|
||||
|
@ -179,7 +180,8 @@ public:
|
|||
MLV_ReadonlyProperty,
|
||||
MLV_NoSetterProperty,
|
||||
MLV_MemberFunction,
|
||||
MLV_SubObjCPropertySetting
|
||||
MLV_SubObjCPropertySetting,
|
||||
MLV_SubObjCPropertyGetterSetting
|
||||
};
|
||||
isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx,
|
||||
SourceLocation *Loc = 0) const;
|
||||
|
|
|
@ -1869,7 +1869,11 @@ 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">;
|
||||
"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">;
|
||||
|
||||
def ext_freestanding_complex : Extension<
|
||||
"complex numbers are an extension in a freestanding C99 implementation">;
|
||||
|
|
|
@ -1068,8 +1068,11 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
|
|||
if (m->isArrow())
|
||||
return LV_Valid;
|
||||
Expr *BaseExp = m->getBase();
|
||||
return (BaseExp->getStmtClass() == ObjCPropertyRefExprClass) ?
|
||||
LV_SubObjCPropertySetting : BaseExp->isLvalue(Ctx);
|
||||
if (BaseExp->getStmtClass() == ObjCPropertyRefExprClass)
|
||||
return LV_SubObjCPropertySetting;
|
||||
return
|
||||
(BaseExp->getStmtClass() == ObjCImplicitSetterGetterRefExprClass) ?
|
||||
LV_SubObjCPropertyGetterSetting : BaseExp->isLvalue(Ctx);
|
||||
}
|
||||
|
||||
// -- If it refers to a static member function [...], then
|
||||
|
@ -1092,8 +1095,11 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
|
|||
if (m->isArrow())
|
||||
return LV_Valid;
|
||||
Expr *BaseExp = m->getBase();
|
||||
return (BaseExp->getStmtClass() == ObjCPropertyRefExprClass) ?
|
||||
LV_SubObjCPropertySetting : BaseExp->isLvalue(Ctx);
|
||||
if (BaseExp->getStmtClass() == ObjCPropertyRefExprClass)
|
||||
return LV_SubObjCPropertySetting;
|
||||
return
|
||||
(BaseExp->getStmtClass() == ObjCImplicitSetterGetterRefExprClass) ?
|
||||
LV_SubObjCPropertyGetterSetting : BaseExp->isLvalue(Ctx);
|
||||
}
|
||||
case UnaryOperatorClass:
|
||||
if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref)
|
||||
|
@ -1283,7 +1289,9 @@ Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const {
|
|||
}
|
||||
return MLV_InvalidExpression;
|
||||
case LV_MemberFunction: return MLV_MemberFunction;
|
||||
case LV_SubObjCPropertySetting: return MLV_SubObjCPropertySetting;
|
||||
case LV_SubObjCPropertySetting: return MLV_SubObjCPropertySetting;
|
||||
case LV_SubObjCPropertyGetterSetting:
|
||||
return MLV_SubObjCPropertyGetterSetting;
|
||||
}
|
||||
|
||||
// The following is illegal:
|
||||
|
|
|
@ -5734,6 +5734,9 @@ 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;
|
||||
|
|
|
@ -18,3 +18,17 @@ void foo() {
|
|||
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}}
|
||||
}
|
||||
|
||||
// radar 7628953
|
||||
|
||||
@interface Gorf {
|
||||
}
|
||||
- (NSSize)size;
|
||||
@end
|
||||
|
||||
@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}}
|
||||
}
|
||||
- (NSSize)size {}
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue