]> granicus.if.org Git - clang/commitdiff
Patch to generate meta-data for prtocol used
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Apr 2009 18:47:34 +0000 (18:47 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 10 Apr 2009 18:47:34 +0000 (18:47 +0000)
in @protocol expression.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68806 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCMac.cpp
test/CodeGenObjC/protocol-definition-hidden-visibility.m [new file with mode: 0644]

index a06959f1de778044d785e2826b67bf01f93b770c..ae70dc568b0691101dbd483644204bbf12af7b9d 100644 (file)
@@ -4327,7 +4327,10 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CGBuilderTy &Builder,
                                             const ObjCProtocolDecl *PD) {
   
-  llvm::Constant *Init =  llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
+  // This routine is called for @protocol only. So, we must build definition
+  // of protocol's meta-data (not a reference to it!)
+  //
+  llvm::Constant *Init =  llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
                                         ObjCTypes.ExternalProtocolPtrTy);
   
   std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_");
diff --git a/test/CodeGenObjC/protocol-definition-hidden-visibility.m b/test/CodeGenObjC/protocol-definition-hidden-visibility.m
new file mode 100644 (file)
index 0000000..31a864b
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: clang-cc -triple x86_64-apple-darwin10  -S -o - %s | grep -e "private_extern l_OBJC_PROTOCOL_" | count 2
+
+@interface FOO @end
+
+@interface NSObject @end
+
+@protocol SSHIPCProtocolHandler_BDC;
+
+typedef NSObject<SSHIPCProtocolHandler_BDC> _SSHIPCProtocolHandler_BDC;
+
+@interface SSHIPC_v2_RPFSProxy
+@property(nonatomic,readonly,retain) _SSHIPCProtocolHandler_BDC* protocolHandler_BDC;
+@end
+
+@implementation FOO
+- (_SSHIPCProtocolHandler_BDC*) protocolHandler_BDC {@protocol(SSHIPCProtocolHandler_BDC); }
+@end
+
+