From: John McCall Date: Tue, 10 Mar 2015 18:41:23 +0000 (+0000) Subject: Recognize objc_bridge(id) on bridged casts to CF types. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9bbc1a72beb9b894302b20d9f8dbe8c9636ec1a;p=clang Recognize objc_bridge(id) on bridged casts to CF types. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231814 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 7d7d3ecc3d..1fa94e9d2c 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -3477,6 +3477,9 @@ static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, if (TB *ObjCBAttr = getObjCBridgeAttr(TD)) { if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) { HadTheAttribute = true; + if (Parm->isStr("id")) + return true; + NamedDecl *Target = nullptr; // Check for an existing type with this name. LookupResult R(S, DeclarationName(Parm), SourceLocation(), diff --git a/test/SemaObjC/arc-bridged-cast.m b/test/SemaObjC/arc-bridged-cast.m index 439d382116..9e716f9d40 100644 --- a/test/SemaObjC/arc-bridged-cast.m +++ b/test/SemaObjC/arc-bridged-cast.m @@ -62,3 +62,21 @@ CFTypeRef fixitsWithSpace(id obj) { // CHECK: fix-it:"{{.*}}":{59:9-59:9}:"(__bridge CFTypeRef)" // CHECK: fix-it:"{{.*}}":{59:9-59:9}:" CFBridgingRetain" } + +// rdar://problem/20107345 +typedef const struct __attribute__((objc_bridge(id))) __CFAnnotatedObject *CFAnnotatedObjectRef; +CFAnnotatedObjectRef CFGetAnnotated(); + +void testObjCBridgeId() { + id obj; + obj = (__bridge id)CFGetAnnotated(); + obj = (__bridge NSString*)CFGetAnnotated(); + obj = (__bridge_transfer id)CFGetAnnotated(); + obj = (__bridge_transfer NSString*)CFGetAnnotated(); + + CFAnnotatedObjectRef ref; + ref = (__bridge CFAnnotatedObjectRef) CreateSomething(); + ref = (__bridge CFAnnotatedObjectRef) CreateNSString(); + ref = (__bridge_retained CFAnnotatedObjectRef) CreateSomething(); + ref = (__bridge_retained CFAnnotatedObjectRef) CreateNSString(); +} diff --git a/test/SemaObjCXX/arc-bridged-cast.mm b/test/SemaObjCXX/arc-bridged-cast.mm index 1ea67a347e..55cdd3f2c4 100644 --- a/test/SemaObjCXX/arc-bridged-cast.mm +++ b/test/SemaObjCXX/arc-bridged-cast.mm @@ -34,3 +34,21 @@ void to_cf(id obj) { } template void to_cf(id); + +// rdar://problem/20107345 +typedef const struct __attribute__((objc_bridge(id))) __CFAnnotatedObject *CFAnnotatedObjectRef; +CFAnnotatedObjectRef CFGetAnnotated(); + +void testObjCBridgeId() { + id obj; + obj = (__bridge id)CFGetAnnotated(); + obj = (__bridge NSString*)CFGetAnnotated(); + obj = (__bridge_transfer id)CFGetAnnotated(); + obj = (__bridge_transfer NSString*)CFGetAnnotated(); + + CFAnnotatedObjectRef ref; + ref = (__bridge CFAnnotatedObjectRef) CreateSomething(); + ref = (__bridge CFAnnotatedObjectRef) CreateNSString(); + ref = (__bridge_retained CFAnnotatedObjectRef) CreateSomething(); + ref = (__bridge_retained CFAnnotatedObjectRef) CreateNSString(); +}