summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-08-06 03:17:00 +0000
committerDouglas Gregor <dgregor@apple.com>2009-08-06 03:17:00 +0000
commitd806156d5459555168540fdf3db4f473cd3f81cf (patch)
tree60b3a05de9f6f9ff7e8cdf02aec449cdf69eefd6 /clang/lib/Parse/ParseExpr.cpp
parent3c7b95d9aaaa06a856aa08a6ebce23d4825b15d9 (diff)
downloadbcm5719-llvm-d806156d5459555168540fdf3db4f473cd3f81cf.tar.gz
bcm5719-llvm-d806156d5459555168540fdf3db4f473cd3f81cf.zip
Support nested-name-specifiers for C++ member access expressions, e.g.,
this->Base::foo from James Porter! llvm-svn: 78278
Diffstat (limited to 'clang/lib/Parse/ParseExpr.cpp')
-rw-r--r--clang/lib/Parse/ParseExpr.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 4720bcb5722..62bd9ae73ce 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -919,6 +919,16 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) {
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 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) {
LHS = Actions.ActOnMemberReferenceExpr(CurScope, move(LHS), OpLoc,
OpKind, Tok.getLocation(),
*Tok.getIdentifierInfo(),
- ObjCImpDecl);
+ ObjCImpDecl, &SS);
}
+
+ if (getLang().CPlusPlus)
+ Actions.ActOnCXXExitMemberScope(CurScope, MemberSS);
+
ConsumeToken();
break;
}
OpenPOWER on IntegriCloud