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