<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Nov 18, 2013, at 16:13, Douglas Gregor <<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br>On Nov 16, 2013, at 3:22 PM, Fariborz Jahanian <<a href="mailto:fjahanian@apple.com">fjahanian@apple.com</a>> wrote:<br><br><blockquote type="cite">Author: fjahanian<br>Date: Sat Nov 16 17:22:37 2013<br>New Revision: 194938<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=194938&view=rev">http://llvm.org/viewvc/llvm-project?rev=194938&view=rev</a><br>Log:<br>ObjectiveC ARC. More validation of toll-free bridging of<br>CF objects with objc_bridge'ing annotaiton.<br>// <a href="rdar://15454846">rdar://15454846</a><br><br>Modified:<br>  cfe/trunk/lib/Sema/SemaExprObjC.cpp<br>  cfe/trunk/test/SemaObjC/objcbridge-attribute.m<br><br>Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=194938&r1=194937&r2=194938&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=194938&r1=194937&r2=194938&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)<br>+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Sat Nov 16 17:22:37 2013<br>@@ -3190,7 +3190,11 @@ static bool CheckObjCBridgeNSCast(Sema &<br>             S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)<br>               << TDNDecl->getName() << Target->getName() << CastClass->getName();<br>             return true;<br>-            }<br>+            } else {<br>+              S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge)<br>+                << TDNDecl->getName() << Target->getName() << castType;<br>+              return true;<br>+           }<br>         }<br>       }<br>       S.Diag(castExpr->getLocStart(), diag::err_objc_cf_bridged_not_interface)<br>@@ -3233,6 +3237,11 @@ static bool CheckObjCBridgeCFCast(Sema &<br>               << ExprClass->getName() << TDNDecl->getName();<br>             S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>             return true;<br>+            } else {<br>+              S.Diag(castExpr->getLocStart(), diag::warn_objc_invalid_bridge_to_cf)<br>+                << castExpr->getType() << castType;<br>+              S.Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>+              return true;<br>           }<br>         }<br>       }<br><br>Modified: cfe/trunk/test/SemaObjC/objcbridge-attribute.m<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objcbridge-attribute.m?rev=194938&r1=194937&r2=194938&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objcbridge-attribute.m?rev=194938&r1=194937&r2=194938&view=diff</a><br>==============================================================================<br>--- cfe/trunk/test/SemaObjC/objcbridge-attribute.m (original)<br>+++ cfe/trunk/test/SemaObjC/objcbridge-attribute.m Sat Nov 16 17:22:37 2013<br>@@ -1,7 +1,7 @@<br>// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s<br>// <a href="rdar://15454846">rdar://15454846</a><br><br>-typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note {{declared here}}<br>+typedef struct __CFErrorRef * __attribute__ ((objc_bridge(NSError))) CFErrorRef; // expected-note 2 {{declared here}}<br><br>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}}<br><br>@@ -48,10 +48,12 @@ typedef CFErrorRef1 CFErrorRef2;<br><br>@class NSString;<br><br>-void Test2(CFErrorRef2 cf, NSError *ns, NSString *str) {<br>+void Test2(CFErrorRef2 cf, NSError *ns, NSString *str, Class c) {<br> (void)(NSString *)cf; // expected-warning {{CFErrorRef bridges to NSError, not NSString}}<br> (void)(NSError *)cf; // okay<br> (void)(MyError*)cf; // okay,<br> (void)(CFErrorRef)ns; // okay<br> (void)(CFErrorRef)str;  // expected-warning {{NSString cannot bridge to CFErrorRef}}<br>+  (void)(Class)cf; // expected-warning {{CFErrorRef bridges to NSError, not 'Class'}}<br>+  (void)(CFErrorRef)c; // expected-warning {{'Class' cannot bridge to 'CFErrorRef’}}<br></blockquote><br>‘Class’ behaves like ‘id’, doesn’t it? Shouldn’t these be accepted without a warning?<br></div></blockquote></div><br><div>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").</div><div><br></div><div>Jordan</div></body></html>