Author: fjahanian Date: Tue Apr 3 12:35:38 2012 New Revision: 153960 URL: http://llvm.org/viewvc/llvm-project?rev=153960&view=rev Log: modern objective-c translator: rewriter linkage spec. // rdar://11169733
Added: cfe/trunk/test/Rewriter/objc-modern-linkage-spec.mm Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Modified: cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp?rev=153960&r1=153959&r2=153960&view=diff ============================================================================== --- cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp (original) +++ cfe/trunk/lib/Rewrite/RewriteModernObjC.cpp Tue Apr 3 12:35:38 2012 @@ -329,6 +329,7 @@ Stmt *RewriteBreakStmt(BreakStmt *S); Stmt *RewriteContinueStmt(ContinueStmt *S); void RewriteCastExpr(CStyleCastExpr *CE); + void RewriteLinkageSpec(LinkageSpecDecl *LSD); // Block rewriting. void RewriteBlocksInFunctionProtoType(QualType funcType, NamedDecl *D); @@ -672,6 +673,7 @@ if (PD->isThisDeclarationADefinition()) RewriteProtocolDecl(PD); } else if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) { + RewriteLinkageSpec(LSD); // Recurse into linkage specifications for (DeclContext::decl_iterator DI = LSD->decls_begin(), DIEnd = LSD->decls_end(); @@ -693,6 +695,12 @@ RewriteForwardClassDecl(DG); continue; } + else { + // Keep track of all interface declarations seen. + ObjCInterfacesSeen.push_back(IFace); + ++DI; + continue; + } } if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>((*DI))) { @@ -1058,6 +1066,22 @@ ReplaceText(LocStart, 0, "// "); } +void +RewriteModernObjC::RewriteLinkageSpec(LinkageSpecDecl *LSD) { + SourceLocation LocStart = LSD->getExternLoc(); + if (LocStart.isInvalid()) + llvm_unreachable("Invalid extern SourceLocation"); + + ReplaceText(LocStart, 0, "// "); + if (!LSD->hasBraces()) + return; + // FIXME. We don't rewrite well if '{' is not on same line as 'extern'. + SourceLocation LocRBrace = LSD->getRBraceLoc(); + if (LocRBrace.isInvalid()) + llvm_unreachable("Invalid rbrace SourceLocation"); + ReplaceText(LocRBrace, 0, "// "); +} + void RewriteModernObjC::RewriteTypeIntoString(QualType T, std::string &ResultStr, const FunctionType *&FPRetType) { if (T->isObjCQualifiedIdType()) Added: cfe/trunk/test/Rewriter/objc-modern-linkage-spec.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/objc-modern-linkage-spec.mm?rev=153960&view=auto ============================================================================== --- cfe/trunk/test/Rewriter/objc-modern-linkage-spec.mm (added) +++ cfe/trunk/test/Rewriter/objc-modern-linkage-spec.mm Tue Apr 3 12:35:38 2012 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -x objective-c++ -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: %clang_cc1 -fsyntax-only -Wno-attributes -D"__declspec(X)=" %t-rw.cpp +// rdar://11169733 + +extern "C" __declspec(dllexport) +@interface Test @end + +@implementation Test @end + +extern "C" { +__declspec(dllexport) +@interface Test1 @end + +@implementation Test1 @end + +__declspec(dllexport) +@interface Test2 @end + +@implementation Test2 @end +}; + _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits