diff options
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 9 | ||||
-rw-r--r-- | clang/test/CodeGenObjCXX/implementation-in-extern-c.mm | 17 |
2 files changed, 25 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 5425eaf64eb..65ba91a6389 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2582,8 +2582,15 @@ void CodeGenModule::EmitLinkageSpec(const LinkageSpecDecl *LSD) { } for (RecordDecl::decl_iterator I = LSD->decls_begin(), E = LSD->decls_end(); - I != E; ++I) + I != E; ++I) { + if (ObjCImplDecl *OID = dyn_cast<ObjCImplDecl>(*I)) { + for (ObjCContainerDecl::method_iterator M = OID->meth_begin(), + MEnd = OID->meth_end(); + M != MEnd; ++M) + EmitTopLevelDecl(*M); + } EmitTopLevelDecl(*I); + } } /// EmitTopLevelDecl - Emit code for a single top level declaration. diff --git a/clang/test/CodeGenObjCXX/implementation-in-extern-c.mm b/clang/test/CodeGenObjCXX/implementation-in-extern-c.mm new file mode 100644 index 00000000000..4c1ee256f42 --- /dev/null +++ b/clang/test/CodeGenObjCXX/implementation-in-extern-c.mm @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -emit-llvm %s -o /dev/null +// rdar://12581683 + +extern "C" { +@interface RetainBucket ++ (id) sharedRetainBucket; +@end + +@implementation RetainBucket ++ (id) sharedRetainBucket +{ + static id sharedBucket = (id)0; + return sharedBucket; +} +@end +} + |