diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 61182ef9cd..229c1815f2 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -60,11 +60,11 @@ Parser::DeclTy *Parser::ParseNamespace(unsigned Context) { // FIXME: save these somewhere. AttrList = ParseAttributes(); - if (Tok.is(tok::equal)) { + if (Tok.is(tok::equal)) // FIXME: Verify no attributes were present. - // FIXME: parse this. - } else if (Tok.is(tok::l_brace)) { - + return ParseNamespaceAlias(IdentLoc, Ident); + + if (Tok.is(tok::l_brace)) { SourceLocation LBrace = ConsumeBrace(); // Enter a scope for the namespace. @@ -96,6 +96,37 @@ Parser::DeclTy *Parser::ParseNamespace(unsigned Context) { return 0; } +/// ParseNamespaceAlias - Parse the part after the '=' in a namespace +/// alias definition. +/// +Parser::DeclTy *Parser::ParseNamespaceAlias(SourceLocation AliasLoc, + IdentifierInfo *Alias) { + assert(Tok.is(tok::equal) && "Not equal token"); + + ConsumeToken(); // eat the '='. + + CXXScopeSpec SS; + // Parse (optional) nested-name-specifier. + ParseOptionalCXXScopeSpecifier(SS); + + if (SS.isInvalid() || Tok.isNot(tok::identifier)) { + Diag(Tok, diag::err_expected_namespace_name); + // Skip to end of the definition and eat the ';'. + SkipUntil(tok::semi); + return 0; + } + + // Parse identifier. + IdentifierInfo *NamespaceName = Tok.getIdentifierInfo(); + SourceLocation NamespaceLoc = ConsumeToken(); + + // Eat the ';'. + ExpectAndConsume(tok::semi, diag::err_expected_semi_after, + "namespace name", tok::semi); + + return 0; +} + /// ParseLinkage - We know that the current token is a string_literal /// and just before that, that extern was seen. /// |