diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-12-16 22:23:02 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-12-16 22:23:02 +0000 |
commit | f44515a49b549171dc3ee9faa6281b72609da563 (patch) | |
tree | 35d055f6565248f38a37956a46cca974f2388ade /lib/Parse/ParseDeclCXX.cpp | |
parent | f595eb04a77d2544fac1f37e4b4c3183ac8c17f7 (diff) |
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
Diffstat (limited to 'lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 377186713e..ec2a37a852 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -108,24 +108,26 @@ Parser::DeclTy *Parser::ParseLinkage(unsigned Context) { 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(); - } - - RBrace = MatchRHSPunctuation(tok::r_brace, LBrace); - } + if (D) + return Actions.ActOnLinkageSpec(Loc, LangBufPtr, StrSize, D); - if (!D) 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); + } - 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 |