[cfe-commits] r155036 - in /cfe/trunk: lib/Sema/SemaPseudoObject.cpp test/SemaObjC/error-implicit-property.m

jahanian fjahanian at apple.com
Wed Apr 18 13:34:05 PDT 2012


On Apr 18, 2012, at 12:35 PM, David Blaikie wrote:

> On Wed, Apr 18, 2012 at 12:13 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
>> Author: fjahanian
>> Date: Wed Apr 18 14:13:23 2012
>> New Revision: 155036
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=155036&view=rev
>> Log:
>> objective-c: Issue diagnostic when an implicit
>> property accessor (getter) missing, instead of crashing.
>> // rdar://11273060
> 
> Nice - thanks!
> 
>> Added:
>>    cfe/trunk/test/SemaObjC/error-implicit-property.m
>> Modified:
>>    cfe/trunk/lib/Sema/SemaPseudoObject.cpp
>> 
>> Modified: cfe/trunk/lib/Sema/SemaPseudoObject.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaPseudoObject.cpp?rev=155036&r1=155035&r2=155036&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaPseudoObject.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaPseudoObject.cpp Wed Apr 18 14:13:23 2012
>> @@ -214,6 +214,7 @@
>> 
>>     ObjCMethodDecl *Setter;
>>     Selector SetterSelector;
>> +    Selector GetterSelector;
>> 
>>   public:
>>     ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) :
>> @@ -475,8 +476,24 @@
>> 
>>   // For implicit properties, just trust the lookup we already did.
>>   if (RefExpr->isImplicitProperty()) {
>> -    Getter = RefExpr->getImplicitPropertyGetter();
>> -    return (Getter != 0);
>> +    if ((Getter = RefExpr->getImplicitPropertyGetter())) {
>> +      GetterSelector = Getter->getSelector();
>> +      return true;
>> +    }
>> +    else {
>> +      // Must build the getter selector the hard way.
>> +      ObjCMethodDecl *setter = RefExpr->getImplicitPropertySetter();
>> +      assert(setter && "both setter and getter are null - cannot happen");
>> +      IdentifierInfo *setterName =
>> +        setter->getSelector().getIdentifierInfoForSlot(0);
>> +      const char *compStr = setterName->getNameStart();
>> +      compStr += 3;
>> +      IdentifierInfo *getterName = &S.Context.Idents.get(compStr);
>> +      GetterSelector =
>> +        S.PP.getSelectorTable().getNullarySelector(getterName);
>> +      return false;
>> +
>> +    }
>>   }
>> 
>>   ObjCPropertyDecl *prop = RefExpr->getExplicitProperty();
>> @@ -776,7 +793,7 @@
>>     assert(RefExpr->isImplicitProperty());
>>     S.Diag(opcLoc, diag::err_nogetter_property_incdec)
>>       << unsigned(UnaryOperator::isDecrementOp(opcode))
>> -      << RefExpr->getImplicitPropertyGetter()->getSelector() // FIXME!
>> +      << GetterSelector
>>       << op->getSourceRange();
>>     return ExprError();
>>   }
>> 
>> Added: cfe/trunk/test/SemaObjC/error-implicit-property.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/error-implicit-property.m?rev=155036&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/SemaObjC/error-implicit-property.m (added)
>> +++ cfe/trunk/test/SemaObjC/error-implicit-property.m Wed Apr 18 14:13:23 2012
>> @@ -0,0 +1,30 @@
>> +// RUN: %clang_cc1 -verify %s
>> +// rdar://11273060
>> +
>> + at interface I
>> +- (void) setP : (int)arg;
>> + at end
>> +
>> + at interface J
>> +  - (int) P;
>> + at end
>> +
>> + at interface K @end
>> +
>> + at interface II @end
>> +
>> + at implementation II
>> +- (void) Meth : (I*) arg {
>> +  arg.P++; // expected-error {{no getter method 'P' for increment of property}}
>> +  --arg.P; // expected-error {{no getter method 'P' for decrement of property}}
> 
> Just out of curiosity - is there a reason that this particular line,
> out of all six cases, uses the prefix form rather than the postfix?

No particular reason. I just wrote it that way.

- Fariborz




More information about the cfe-commits mailing list