Fixed a rewrite bug in class synthesis (which I first thought was a rewrite API bug).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44335 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index cc6d569..043b260 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -1318,8 +1318,6 @@
   // If no ivars and no root or if its root, directly or indirectly,
   // have no ivars (thus not synthesized) then no need to synthesize this class.
   if (NumIvars <= 0 && (!RCDecl || !ObjcSynthesizedStructs.count(RCDecl))) {
-    //FIXME: This does not replace @interface class-name with the 
-    //Result text. Could be a bug in ReplaceText API.
     endBuf += Lexer::MeasureTokenLength(LocEnd, *SM);
     Rewrite.ReplaceText(LocStart, endBuf-startBuf, 
                         Result.c_str(), Result.size());
@@ -1756,8 +1754,12 @@
   int NumIvars = IDecl->getImplDeclNumIvars() > 0 
                    ? IDecl->getImplDeclNumIvars() 
                    : (CDecl ? CDecl->getNumInstanceVariables() : 0);
-  
-  SynthesizeObjcInternalStruct(CDecl, Result);
+  // Explictly declared @interface's are already synthesized.
+  if (CDecl->ImplicitInterfaceDecl()) {
+    // FIXME: Implementation of a class with no @interface (legacy) doese not 
+    // produce correct synthesis as yet.
+    SynthesizeObjcInternalStruct(CDecl, Result);
+  }
   
   if (NumIvars > 0) {
     static bool objc_ivar = false;