diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-08 18:00:39 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-08 18:00:39 +0000 |
commit | 03b4f666edfcd48e009ec5cfde7837e45652b185 (patch) | |
tree | 943b60a5caf8106f44f3a4e6f58ab34ae3fad998 /clang | |
parent | 490b8c0f5baaa216cf0757c5c2ac6881a752062e (diff) | |
download | bcm5719-llvm-03b4f666edfcd48e009ec5cfde7837e45652b185.tar.gz bcm5719-llvm-03b4f666edfcd48e009ec5cfde7837e45652b185.zip |
Implement [expr.mptr.oper]p6 for '->*' operator.
llvm-svn: 83562
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 14 | ||||
-rw-r--r-- | clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp | 1 | ||||
-rw-r--r-- | clang/test/SemaCXX/member-pointer.cpp | 2 |
3 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 7461e635c6b..98348d6efc9 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -922,11 +922,21 @@ Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const { return BinOp->getRHS()->isLvalue(Ctx); // C++ [expr.mptr.oper]p6 - if ((BinOp->getOpcode() == BinaryOperator::PtrMemD || - BinOp->getOpcode() == BinaryOperator::PtrMemI) && + // The result of a .* expression is an lvalue only if its first operand is + // an lvalue and its second operand is a pointer to data member. + if (BinOp->getOpcode() == BinaryOperator::PtrMemD && !BinOp->getType()->isFunctionType()) return BinOp->getLHS()->isLvalue(Ctx); + // The result of an ->* expression is an lvalue only if its second operand + // is a pointer to data member. + if (BinOp->getOpcode() == BinaryOperator::PtrMemI && + !BinOp->getType()->isFunctionType()) { + QualType Ty = BinOp->getRHS()->getType(); + if (Ty->isMemberPointerType() && !Ty->isMemberFunctionPointerType()) + return LV_Valid; + } + if (!BinOp->isAssignmentOp()) return LV_InvalidExpression; diff --git a/clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp b/clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp index 304e8d13988..46c8ae8b6b9 100644 --- a/clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp +++ b/clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp @@ -36,6 +36,7 @@ struct C1 : B1 { void foo1(C1 c1, int A::* pmf) { int i = c1->*pmf; + c1->*pmf = 10; } void foo1(C1 c1, int E::* pmf) { diff --git a/clang/test/SemaCXX/member-pointer.cpp b/clang/test/SemaCXX/member-pointer.cpp index 9e407a184c3..d13b16e6d67 100644 --- a/clang/test/SemaCXX/member-pointer.cpp +++ b/clang/test/SemaCXX/member-pointer.cpp @@ -99,7 +99,7 @@ void h() { int i = phm->*pi; (void)&(hm.*pi); (void)&(phm->*pi); - (void)&((&hm)->*pi); // expected-error {{address expression must be an lvalue or a function designator}} + (void)&((&hm)->*pi); void (HasMembers::*pf)() = &HasMembers::f; (hm.*pf)(); |