summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-10-08 18:00:39 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-10-08 18:00:39 +0000
commit03b4f666edfcd48e009ec5cfde7837e45652b185 (patch)
tree943b60a5caf8106f44f3a4e6f58ab34ae3fad998 /clang
parent490b8c0f5baaa216cf0757c5c2ac6881a752062e (diff)
downloadbcm5719-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.cpp14
-rw-r--r--clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp1
-rw-r--r--clang/test/SemaCXX/member-pointer.cpp2
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)();
OpenPOWER on IntegriCloud