From f67606ae2febe3bb0718f05040c6c4bc2c2c3276 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 28 Mar 2009 04:07:16 +0000 Subject: [PATCH] Parse namespace aliases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67908 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Parse/Parser.h | 3 ++- lib/Parse/ParseDeclCXX.cpp | 39 ++++++++++++++++++++++++++--- test/Parser/cxx-namespace-alias.cpp | 8 ++++++ 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 test/Parser/cxx-namespace-alias.cpp diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 630b7ea499..f502b3e4aa 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -997,7 +997,8 @@ private: DeclTy *ParseUsingDirective(unsigned Context, SourceLocation UsingLoc); DeclTy *ParseUsingDeclaration(unsigned Context, SourceLocation UsingLoc); DeclTy *ParseStaticAssertDeclaration(); - + DeclTy *ParseNamespaceAlias(SourceLocation AliasLoc, IdentifierInfo *Alias); + //===--------------------------------------------------------------------===// // C++ 9: classes [class] and C structs/unions. TypeTy *ParseClassName(SourceLocation &EndLocation, 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. /// diff --git a/test/Parser/cxx-namespace-alias.cpp b/test/Parser/cxx-namespace-alias.cpp new file mode 100644 index 0000000000..65e1459d37 --- /dev/null +++ b/test/Parser/cxx-namespace-alias.cpp @@ -0,0 +1,8 @@ +// RUN: clang-cc -parse-noop -verify %s + +namespace A = B; + +namespace A = !; // expected-error {{expected namespace name}} +namespace A = A::!; // expected-error {{expected namespace name}} + + -- 2.40.0