r194938 - ObjectiveC ARC. More validation of toll-free bridging of
Jordan Rose
jordan_rose at apple.com
Mon Nov 18 16:22:43 PST 2013
On Nov 18, 2013, at 16:13, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Nov 16, 2013, at 3:22 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
>
>> Author: fjahanian
>> Date: Sat Nov 16 17:22:37 2013
>> New Revision: 194938
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=194938&view=rev
>> Log:
>> ObjectiveC ARC. More validation of toll-free bridging of
>> CF objects with objc_bridge'ing annotaiton.
>> // rdar://15454846
>>
>> Modified:
>> cfe/trunk/lib/Sema/SemaExprObjC.cpp
>> cfe/trunk/test/SemaObjC/objcbridge-attribute.m
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=194938&r1=194937&r2=194938&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Sat Nov 16 17:22:37 2013
>> @@ -3190,7 +3190,11 @@ static bool CheckObjCBridgeNSCast(Sema &
>> S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
>> << TDNDecl->getName() << Target->getName() << CastClass->getName();
>> return true;
>> - }
>> + } else {
>> + S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)
>> + << TDNDecl->getName() << Target->getName() << castType;
>> + return true;
>> + }
>> }
>> }
>> S.Diag(castExpr->getLocStart(), diag::err_objc_cf_bridged_not_interface)
>> @@ -3233,6 +3237,11 @@ static bool CheckObjCBridgeCFCast(Sema &
>> << ExprClass->getName() << TDNDecl->getName();
>> S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>> return true;
>> + } else {
>> + S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)
>> + << castExpr->getType() << castType;
>> + S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>> + return true;
>> }
>> }
>> }
>>
>> Modified: cfe/trunk/test/SemaObjC/objcbridge-attribute.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objcbridge-attribute.m?rev=194938&r1=194937&r2=194938&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaObjC/objcbridge-attribute.m (original)
>> +++ cfe/trunk/test/SemaObjC/objcbridge-attribute.m Sat Nov 16 17:22:37 2013
>> @@ -1,7 +1,7 @@
>> // RUN: %clang_cc1 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
>> // rdar://15454846
>>
>> -typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note {{declared here}}
>> +typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note 2 {{declared here}}
>>
>> typedef struct __CFMyColor * __attribute__((objc_bridge(12))) CFMyColorRef; // expected-error {{parameter of 'objc_bridge' attribute must be a single name of an Objective-C class}}
>>
>> @@ -48,10 +48,12 @@ typedef CFErrorRef1 CFErrorRef2;
>>
>> @class NSString;
>>
>> -void Test2(CFErrorRef2 cf, NSError *ns, NSString *str) {
>> +void Test2(CFErrorRef2 cf, NSError *ns, NSString *str, Class c) {
>> (void)(NSString *)cf; // expected-warning {{CFErrorRef bridges to NSError, not NSString}}
>> (void)(NSError *)cf; // okay
>> (void)(MyError*)cf; // okay,
>> (void)(CFErrorRef)ns; // okay
>> (void)(CFErrorRef)str; // expected-warning {{NSString cannot bridge to CFErrorRef}}
>> + (void)(Class)cf; // expected-warning {{CFErrorRef bridges to NSError, not 'Class'}}
>> + (void)(CFErrorRef)c; // expected-warning {{'Class' cannot bridge to 'CFErrorRef’}}
>
> ‘Class’ behaves like ‘id’, doesn’t it? Shouldn’t these be accepted without a warning?
I don't think so, actually. The only CF type that could represent a class is the base, CFTypeRef. CoreFoundation objects don't have classes (they have "type IDs").
Jordan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131118/c6701fe7/attachment.html>
More information about the cfe-commits
mailing list