[cfe-commits] r153960 - in /cfe/trunk: lib/Rewrite/RewriteModernObjC.cpp test/Rewriter/objc-modern-linkage-spec.mm

Fariborz Jahanian fjahanian at apple.com
Tue Apr 3 10:35:39 PDT 2012


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)
+ at interface Test @end
+
+ at implementation Test @end
+
+extern "C" {
+__declspec(dllexport)
+ at interface Test1 @end
+
+ at implementation Test1 @end
+
+__declspec(dllexport)
+ at interface Test2 @end
+
+ at implementation Test2 @end
+};
+





More information about the cfe-commits mailing list