[cfe-commits] r65562 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaDeclObjC.cpp test/SemaObjC/property-13.m

Sebastian Redl sebastian.redl at getdesigned.at
Thu Feb 26 11:31:25 PST 2009


steve naroff wrote:
>
> On Feb 26, 2009, at 2:16 PM, Sebastian Redl wrote:
>
>> Steve Naroff wrote:
>>> Author: snaroff
>>> Date: Thu Feb 26 13:11:32 2009
>>> New Revision: 65562
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=65562&view=rev
>>> Log:
>>> Fix <rdar://problem/6574319> clang issues error on 'readonly'
>>> property with a defaul setter attribute.
>>>
>>> Needed to make isPropertyReadonly() non-const (for this fix to
>>> compile). I imagine there's a way to retain the const-ness, however
>>> I have more important fish to fry.
>>>
>>> +  // Lastly, look through the implementation (if one is in scope).
>>> +  if (ObjCImplementationDecl *ImpDecl =
>>> +        ObjCImplementations[IDecl->getIdentifier()])
>>> +    if (ImpDecl->getInstanceMethod(PDecl->getSetterName()))
>>> +      return false;
>>>   return true;
>>> }
>>>
>> Wouldn't it suffice to make ImpDecl here a pointer-to-const?
>>
>
> Still getting errors...
>
> llvm[2]: Compiling SemaDeclObjC.cpp for Debug build
> SemaDeclObjC.cpp: In member function ‘bool
> clang::Sema::isPropertyReadonly(clang::ObjCPropertyDecl*,
> clang::ObjCInterfaceDecl*) const’:
> SemaDeclObjC.cpp:763: error: no match for ‘operator[]’ in
Right, I forgot. The standard associative map (std::map, llvm::DenseMap,
...) doesn't have a non-const [], because that operator wants to insert
if it doesn't find the value in question.

The correct code uses find() and would be something horrible like this:

llvm::DenseMap<IdentifierInfo*, ObjCImplementationDecl*>::const_iterator
it = ObjCImplementations.find(IDecl->getIdentifier());
if (it != ObjCImplementations.end())
  if ((*it)->getInstanceMethod(PDecl->getSetterName()))
    return false;
return true;

Sebastian



More information about the cfe-commits mailing list