[cfe-commits] r134522 - in /cfe/trunk: include/clang/Basic/Attr.td include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/AttributeList.h lib/Sema/AttributeList.cpp lib/Sema/SemaDeclAttr.cpp lib/Sema/SemaType.cpp test/SemaObjC/arc-unavailable-for-weakref.m
jahanian
fjahanian at apple.com
Wed Jul 6 13:27:28 PDT 2011
On Jul 6, 2011, at 12:46 PM, Douglas Gregor wrote:
>
> On Jul 6, 2011, at 12:24 PM, Fariborz Jahanian wrote:
>
>> Author: fjahanian
>> Date: Wed Jul 6 14:24:05 2011
>> New Revision: 134522
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=134522&view=rev
>> Log:
>> objc-arc: Support objc_arc_weak_unavailable on those
>> classes which are incompatible with weak references.
>> // rdar://9693477
>
> Excellent. A few minor comments below.
>
>> Modified: cfe/trunk/lib/Sema/SemaType.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=134522&r1=134521&r2=134522&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaType.cpp Wed Jul 6 14:24:05 2011
>> @@ -3207,7 +3207,30 @@
>> attr.setInvalid();
>> return true;
>> }
>> -
>> +
>> + // Forbid __weak for class objects marked as
>> + // objc_arc_weak_reference_unavailable
>> + if (lifetime == Qualifiers::OCL_Weak) {
>> + QualType T = type;
>> + if (T->isReferenceType()) {
>> + T = T->getAs<ReferenceType>()->getPointeeType();
>> + }
>
> if (const ReferenceType *Ref = T->getAs<ReferenceType>())
> T = Ref->getPointeeType();
dumb of me :).
>
> ?
>
> Since you used that pattern below.
>
>> + while (const PointerType *ptr = T->getAs<PointerType>())
>> + T = ptr->getPointeeType();
>> + if (const ObjCObjectPointerType *ObjT = T->getAs<ObjCObjectPointerType>()) {
>> + ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl();
>> + while (Class) {
>> + if (Class->hasAttr<ArcWeakrefUnavailableAttr>()) {
>> + S.Diag(attr.getLoc(), diag::err_arc_unsupported_weak_class);
>> + S.Diag(ObjT->getInterfaceDecl()->getLocation(),
>> + diag::note_class_declared);
>> + break;
>> + }
>> + Class = Class->getSuperClass();
>> + }
>> + }
>> + }
>> +
>> return true;
>> }
>
> Should this hasAttr<ArcWeakrefUnavailableAttr>() loop over superclasses be moved in an isArcWeakrefUnavailable() method on the ObjCInterfaceDecl? I could imagine it being reused by, e.g., the migrator.
Sure.
- fj
>
> - Doug
More information about the cfe-commits
mailing list