[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