aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseDeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-12-16 22:23:02 +0000
committerDouglas Gregor <dgregor@apple.com>2008-12-16 22:23:02 +0000
commitf44515a49b549171dc3ee9faa6281b72609da563 (patch)
tree35d055f6565248f38a37956a46cca974f2388ade /lib/Parse/ParseDeclCXX.cpp
parentf595eb04a77d2544fac1f37e4b4c3183ac8c17f7 (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.cpp26
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