From: Rafael Espindola Date: Fri, 12 Sep 2014 20:14:20 +0000 (+0000) Subject: Allow protocols to be just declared. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6588d9f885021d56b78a6530efdbe7b512d30c7b;p=clang Allow protocols to be just declared. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217704 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 1d1ddee298..dc9810d637 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -6236,7 +6236,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef( // contents for protocols which were referenced but never defined. Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy, - false, llvm::GlobalValue::WeakAnyLinkage, + false, llvm::GlobalValue::ExternalLinkage, nullptr, "\01l_OBJC_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString()); Entry->setSection("__DATA,__datacoal_nt,coalesced"); @@ -6347,8 +6347,8 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( Values); if (Entry) { - // Already created, update the initializer. - assert(Entry->hasWeakAnyLinkage()); + // Already created, fix the linkage and update the initializer. + Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage); Entry->setInitializer(Init); } else { Entry = diff --git a/test/CodeGenObjC/undefined-protocol2.m b/test/CodeGenObjC/undefined-protocol2.m new file mode 100644 index 0000000000..f171523b04 --- /dev/null +++ b/test/CodeGenObjC/undefined-protocol2.m @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx -emit-llvm %s -o - | FileCheck %s + +// Test that we produce a declaration for the protocol. It must be matched +// by a definition in another TU, so external is the correct linkage +// (not extern_weak). +// CHECK: @"\01l_OBJC_PROTOCOL_$_p1" = external global + +@interface NSObject +@end + +@protocol p1; + +@interface I1 : NSObject +@end + +@implementation I1 +@end