Add Code gen support for '->*' operator which fell

through the crack.

llvm-svn: 85160
This commit is contained in:
Fariborz Jahanian 2009-10-26 21:58:25 +00:00
parent 3b7ba5f35b
commit 038374f887
3 changed files with 22 additions and 2 deletions

View File

@ -1378,7 +1378,8 @@ LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
return EmitLValue(E->getRHS());
}
if (E->getOpcode() == BinaryOperator::PtrMemD)
if (E->getOpcode() == BinaryOperator::PtrMemD ||
E->getOpcode() == BinaryOperator::PtrMemI)
return EmitPointerToDataMemberBinaryExpr(E);
// Can only get l-value for binary operator expressions which are a
@ -1567,6 +1568,8 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee, QualType CalleeType,
LValue CodeGenFunction::EmitPointerToDataMemberBinaryExpr(
const BinaryOperator *E) {
llvm::Value *BaseV = EmitLValue(E->getLHS()).getAddress();
if (E->getOpcode() == BinaryOperator::PtrMemI)
BaseV = Builder.CreateLoad(BaseV, "indir.ptr");
const llvm::Type *i8Ty = llvm::Type::getInt8PtrTy(getLLVMContext());
BaseV = Builder.CreateBitCast(BaseV, i8Ty);
LValue RHSLV = EmitLValue(E->getRHS());

View File

@ -329,7 +329,8 @@ void AggExprEmitter::VisitStmtExpr(const StmtExpr *E) {
}
void AggExprEmitter::VisitBinaryOperator(const BinaryOperator *E) {
if (E->getOpcode() == BinaryOperator::PtrMemD)
if (E->getOpcode() == BinaryOperator::PtrMemD ||
E->getOpcode() == BinaryOperator::PtrMemI)
VisitPointerToDataMemberBinaryOperator(E);
else
CGF.ErrorUnsupported(E, "aggregate binary expression");

View File

@ -51,6 +51,21 @@ void test_aggr_pdata(A& a1) {
pr(a1.*af);
}
void test_aggr_pdata_1(A* pa) {
F A::* af = &A::Af;
pr(pa->*af);
(pa->*af).iF = 100;
(pa->*af).fF = 200.00;
printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
pr(pa->*af);
(pa->*af).iF++;
(pa->*af).fF--;
--(pa->*af).fF;
pr(pa->*af);
}
int main()
{
A a1;
@ -67,4 +82,5 @@ int main()
printf("%d\n", &A::B1::V::iV);
printf("%d, %f, %f \n", a1.*pa, a1.*pf, a1.*pd);
test_aggr_pdata(a1);
test_aggr_pdata_1(&a1);
}