[cfe-commits] r95838 - in /cfe/trunk: include/clang/AST/Expr.h include/clang/Basic/DiagnosticSemaKinds.td lib/AST/Expr.cpp lib/Sema/SemaExpr.cpp test/SemaObjC/property-not-lvalue.m
Fariborz Jahanian
fjahanian at apple.com
Thu Feb 11 09:43:24 PST 2010
On Feb 11, 2010, at 8:22 AM, Daniel Dunbar wrote:
> Hi Fariborz,
>
> This doesn't feel right to me. Why is this different than:
> --
> struct s0 { int x; };
> struct s0 f0();
> void f1() { f0().x = 1; }
Property syntax can always be converted into objective-c messaging
syntax. So, in this
case it is equivalent to [self size].width = 2.2; which issues an
lvalue diagnostic in objective-c mode
(as does above test case).
Diagnostics should not be issued on objective-c++ mode, however. Will
change this.
- fariborz
>
> --
>
> - Daniel
>
> On Wed, Feb 10, 2010 at 5:11 PM, Fariborz Jahanian <fjahanian at apple.com
> > wrote:
>> Author: fjahanian
>> Date: Wed Feb 10 19:11:34 2010
>> New Revision: 95838
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=95838&view=rev
>> Log:
>> Diagnose when user provided getter is being used as lvalue
>> using property dot-syntax. Fixes radar 7628953.
>>
>>
>> Modified:
>> cfe/trunk/include/clang/AST/Expr.h
>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> cfe/trunk/lib/AST/Expr.cpp
>> cfe/trunk/lib/Sema/SemaExpr.cpp
>> cfe/trunk/test/SemaObjC/property-not-lvalue.m
>>
>> Modified: cfe/trunk/include/clang/AST/Expr.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=95838&r1=95837&r2=95838&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/Expr.h (original)
>> +++ cfe/trunk/include/clang/AST/Expr.h Wed Feb 10 19:11:34 2010
>> @@ -149,7 +149,8 @@
>> LV_DuplicateVectorComponents,
>> LV_InvalidExpression,
>> LV_MemberFunction,
>> - LV_SubObjCPropertySetting
>> + LV_SubObjCPropertySetting,
>> + LV_SubObjCPropertyGetterSetting
>> };
>> isLvalueResult isLvalue(ASTContext &Ctx) const;
>>
>> @@ -179,7 +180,8 @@
>> MLV_ReadonlyProperty,
>> MLV_NoSetterProperty,
>> MLV_MemberFunction,
>> - MLV_SubObjCPropertySetting
>> + MLV_SubObjCPropertySetting,
>> + MLV_SubObjCPropertyGetterSetting
>> };
>> isModifiableLvalueResult isModifiableLvalue(ASTContext &Ctx,
>> SourceLocation *Loc =
>> 0) const;
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=95838&r1=95837&r2=95838&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Feb 10
>> 19:11:34 2010
>> @@ -1869,7 +1869,11 @@
>> 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">;
>>
>> Modified: cfe/trunk/lib/AST/Expr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=95838&r1=95837&r2=95838&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/lib/AST/Expr.cpp (original)
>> +++ cfe/trunk/lib/AST/Expr.cpp Wed Feb 10 19:11:34 2010
>> @@ -1068,8 +1068,11 @@
>> 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 @@
>> 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 @@
>> }
>> 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:
>>
>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=95838&r1=95837&r2=95838&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Feb 10 19:11:34 2010
>> @@ -5734,6 +5734,9 @@
>> 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;
>>
>> Modified: cfe/trunk/test/SemaObjC/property-not-lvalue.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/property-not-lvalue.m?rev=95838&r1=95837&r2=95838&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- cfe/trunk/test/SemaObjC/property-not-lvalue.m (original)
>> +++ cfe/trunk/test/SemaObjC/property-not-lvalue.m Wed Feb 10
>> 19:11:34 2010
>> @@ -18,3 +18,17 @@
>> 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
>> +
>> + at interface Gorf {
>> +}
>> +- (NSSize)size;
>> + at end
>> +
>> + at 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 {}
>> + at end
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
More information about the cfe-commits
mailing list