diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-02-03 20:19:35 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-02-03 20:19:35 +0000 |
commit | ebc07d57be9e0722b4b9c66625e1fca43dcc2ee0 (patch) | |
tree | 56b421d555ac9fa1a897311d89cd18f37995651b /lib/Parse/ParseExpr.cpp | |
parent | 59e5a0e4f1b3a6f4ddcb0e902e98d8b3c9d10799 (diff) |
Allow taking the address of data members, resulting in a member pointer.
Pointers to functions don't work yet, and pointers to overloaded functions even less. Also, far too much illegal code is accepted.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63655 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseExpr.cpp')
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index c4df632cc8..64c4c31fc4 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -345,7 +345,9 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { } /// ParseCastExpression - Parse a cast-expression, or, if isUnaryExpression is -/// true, parse a unary-expression. +/// true, parse a unary-expression. isAddressOfOperand exists because an +/// id-expression that is the operand of address-of gets special treatment +/// due to member pointers. /// /// cast-expression: [C99 6.5.4] /// unary-expression @@ -451,7 +453,8 @@ Parser::ParseRHSOfBinaryExpression(OwningExprResult LHS, unsigned MinPrec) { /// [GNU] binary-type-trait: /// '__is_base_of' [TODO] /// -Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression) { +Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression, + bool isAddressOfOperand) { OwningExprResult Res(Actions); tok::TokenKind SavedKind = Tok.getKind(); @@ -522,7 +525,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression) { if (getLang().CPlusPlus) { // If TryAnnotateTypeOrScopeToken annotates the token, tail recurse. if (TryAnnotateTypeOrScopeToken()) - return ParseCastExpression(isUnaryExpression); + return ParseCastExpression(isUnaryExpression, isAddressOfOperand); } // Consume the identifier so that we can see if it is followed by a '('. @@ -570,7 +573,15 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression) { Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, move_arg(Res)); return move(Res); } - case tok::amp: // unary-expression: '&' cast-expression + case tok::amp: { // unary-expression: '&' cast-expression + // Special treatment because of member pointers + SourceLocation SavedLoc = ConsumeToken(); + Res = ParseCastExpression(false, true); + if (!Res.isInvalid()) + Res = Actions.ActOnUnaryOp(CurScope, SavedLoc, SavedKind, move_arg(Res)); + return move(Res); + } + case tok::star: // unary-expression: '*' cast-expression case tok::plus: // unary-expression: '+' cast-expression case tok::minus: // unary-expression: '-' cast-expression @@ -662,15 +673,15 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression) { case tok::annot_cxxscope: // [C++] id-expression: qualified-id case tok::kw_operator: // [C++] id-expression: operator/conversion-function-id // template-id - Res = ParseCXXIdExpression(); + Res = ParseCXXIdExpression(isAddressOfOperand); return ParsePostfixExpressionSuffix(move(Res)); case tok::coloncolon: { // ::foo::bar -> global qualified name etc. If TryAnnotateTypeOrScopeToken // annotates the token, tail recurse. if (TryAnnotateTypeOrScopeToken()) - return ParseCastExpression(isUnaryExpression); - + return ParseCastExpression(isUnaryExpression, isAddressOfOperand); + // ::new -> [C++] new-expression // ::delete -> [C++] delete-expression SourceLocation CCLoc = ConsumeToken(); |