summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseDeclCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Parse/ParseDeclCXX.cpp')
-rw-r--r--clang/lib/Parse/ParseDeclCXX.cpp27
1 files changed, 14 insertions, 13 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 32367630214..0b06006d9d0 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -108,27 +108,28 @@ Parser::DeclTy *Parser::ParseLinkage(unsigned Context) {
unsigned StrSize = PP.getSpelling(Tok, LangBufPtr);
SourceLocation Loc = ConsumeStringToken();
- DeclTy *D = 0;
-
- if (Tok.isNot(tok::l_brace)) {
- D = ParseDeclarationOrFunctionDefinition();
- if (D)
- return Actions.ActOnLinkageSpec(Loc, LangBufPtr, StrSize, D);
- return 0;
+ ParseScope LinkageScope(this, Scope::DeclScope);
+ DeclTy *LinkageSpec
+ = Actions.ActOnStartLinkageSpecification(CurScope,
+ /*FIXME: */SourceLocation(),
+ Loc, LangBufPtr, StrSize,
+ Tok.is(tok::l_brace)? Tok.getLocation()
+ : SourceLocation());
+
+ if (Tok.isNot(tok::l_brace)) {
+ ParseDeclarationOrFunctionDefinition();
+ return Actions.ActOnFinishLinkageSpecification(CurScope, LinkageSpec,
+ SourceLocation());
}
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);
+ ParseExternalDeclaration();
}
SourceLocation RBrace = MatchRHSPunctuation(tok::r_brace, LBrace);
- return Actions.ActOnLinkageSpec(Loc, LBrace, RBrace, LangBufPtr, StrSize,
- &InnerDecls.front(), InnerDecls.size());
+ return Actions.ActOnFinishLinkageSpecification(CurScope, LinkageSpec, RBrace);
}
/// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or
OpenPOWER on IntegriCloud