diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 18 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 5 |
2 files changed, 22 insertions, 1 deletions
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index a57d718d48..56484720db 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -326,6 +326,24 @@ Parser::OwningExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) { /*ObjectType=*/0, Name)) return ExprError(); + + // This is only the direct operand of an & operator if it is not + // followed by a postfix-expression suffix. + if (isAddressOfOperand) { + switch (Tok.getKind()) { + case tok::l_square: + case tok::l_paren: + case tok::arrow: + case tok::period: + case tok::plusplus: + case tok::minusminus: + isAddressOfOperand = false; + break; + + default: + break; + } + } return Actions.ActOnIdExpression(CurScope, SS, Name, Tok.is(tok::l_paren), isAddressOfOperand); diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f2ff6b6101..fd79935fbd 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -623,6 +623,9 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S, UnqualifiedId &Name, bool HasTrailingLParen, bool IsAddressOfOperand) { + assert(!(IsAddressOfOperand && HasTrailingLParen) && + "cannot be direct & operand and have a trailing lparen"); + if (Name.getKind() == UnqualifiedId::IK_TemplateId) { ASTTemplateArgsPtr TemplateArgsPtr(*this, Name.TemplateId->getTemplateArgs(), @@ -856,7 +859,7 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc, // performance. if (!ADL) { bool isAbstractMemberPointer = - (isAddressOfOperand && !HasTrailingLParen && SS && !SS->isEmpty()); + (isAddressOfOperand && SS && !SS->isEmpty()); if (!isAbstractMemberPointer && !Lookup.empty() && isa<CXXRecordDecl>((*Lookup.begin())->getDeclContext())) { |