Parse namespace aliases.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67908 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index 61182ef..229c181 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -60,11 +60,11 @@
     // 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 @@
   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.
 ///