Support nested-name-specifiers for C++ member access expressions, e.g.,

  this->Base::foo

from James Porter!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78278 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index 4720bcb..62bd9ae 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -919,6 +919,16 @@
       tok::TokenKind OpKind = Tok.getKind();
       SourceLocation OpLoc = ConsumeToken();  // Eat the "." or "->" token.
 
+      CXXScopeSpec MemberSS;
+      CXXScopeSpec SS;
+      if (getLang().CPlusPlus && !LHS.isInvalid()) {
+        LHS = Actions.ActOnCXXEnterMemberScope(CurScope, MemberSS, move(LHS),
+                                               OpKind);
+        if (LHS.isInvalid())
+          break;
+        ParseOptionalCXXScopeSpecifier(SS);
+      }
+
       if (Tok.isNot(tok::identifier)) {
         Diag(Tok, diag::err_expected_ident);
         return ExprError();
@@ -928,8 +938,12 @@
         LHS = Actions.ActOnMemberReferenceExpr(CurScope, move(LHS), OpLoc,
                                                OpKind, Tok.getLocation(),
                                                *Tok.getIdentifierInfo(),
-                                               ObjCImpDecl);
+                                               ObjCImpDecl, &SS);
       }
+
+      if (getLang().CPlusPlus)
+        Actions.ActOnCXXExitMemberScope(CurScope, MemberSS);
+
       ConsumeToken();
       break;
     }