Patch for collecting ivars before running action on them.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41932 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 7ddcaab..d3b8d8d 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -606,9 +606,12 @@
 void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl) {
   assert(Tok.getKind() == tok::l_brace && "expected {");
   llvm::SmallVector<DeclTy*, 16> IvarDecls;
+  llvm::SmallVector<DeclTy*, 32> AllIvarDecls;
+  llvm::SmallVector<tok::ObjCKeywordKind, 32> AllVisibilities;
   
   SourceLocation LBraceLoc = ConsumeBrace(); // the "{"
   
+  tok::ObjCKeywordKind visibility = tok::objc_private;
   // While we still have something to read, read the instance variables.
   while (Tok.getKind() != tok::r_brace && 
          Tok.getKind() != tok::eof) {
@@ -621,7 +624,6 @@
       continue;
     }
     // Set the default visibility to private.
-    tok::ObjCKeywordKind visibility = tok::objc_private;
     if (Tok.getKind() == tok::at) { // parse objc-visibility-spec
       ConsumeToken(); // eat the @ sign
       switch (Tok.getObjCKeywordID()) {
@@ -639,8 +641,10 @@
       }
     }
     ParseStructDeclaration(interfaceDecl, IvarDecls);
-    for (unsigned i = 0; i < IvarDecls.size(); i++) 
-      Actions.ObjcAddInstanceVariable(interfaceDecl, IvarDecls[i], visibility);
+    for (unsigned i = 0; i < IvarDecls.size(); i++) {
+	AllIvarDecls.push_back(IvarDecls[i]);
+	AllVisibilities.push_back(visibility);
+    }
     IvarDecls.clear();
     
     if (Tok.getKind() == tok::semi) {
@@ -654,6 +658,10 @@
       SkipUntil(tok::r_brace, true, true);
     }
   }
+  if (AllIvarDecls.size()) {  // Check for {} - no ivars in braces
+    Actions.ObjcAddInstanceVariable(interfaceDecl, 
+	      &AllIvarDecls[0], AllIvarDecls.size(), &AllVisibilities[0]);
+  }
   MatchRHSPunctuation(tok::r_brace, LBraceLoc);
   return;
 }