Make linkage-specifications hold on to all of their declarations

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61110 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index 3771867..ec2a37a 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -108,24 +108,26 @@
 
   SourceLocation Loc = ConsumeStringToken();
   DeclTy *D = 0;
-  SourceLocation LBrace, RBrace;
   
   if (Tok.isNot(tok::l_brace)) {
     D = ParseDeclarationOrFunctionDefinition();
-  } else {
-    LBrace = ConsumeBrace();
-    while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
-      // FIXME capture the decls.
-      D = ParseExternalDeclaration();
-    }
+    if (D)
+      return Actions.ActOnLinkageSpec(Loc, LangBufPtr, StrSize, D);
 
-    RBrace = MatchRHSPunctuation(tok::r_brace, LBrace);
+    return 0;
+  } 
+
+  SourceLocation LBrace = ConsumeBrace();
+  llvm::SmallVector<DeclTy *, 8> InnerDecls;
+  while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
+    D = ParseExternalDeclaration();
+    if (D)
+      InnerDecls.push_back(D);
   }
 
-  if (!D)
-    return 0;
-
-  return Actions.ActOnLinkageSpec(Loc, LBrace, RBrace, LangBufPtr, StrSize, D);
+  SourceLocation RBrace = MatchRHSPunctuation(tok::r_brace, LBrace);
+  return Actions.ActOnLinkageSpec(Loc, LBrace, RBrace, LangBufPtr, StrSize,
+                                  &InnerDecls.front(), InnerDecls.size());
 }
 
 /// ParseClassName - Parse a C++ class-name, which names a class. Note