Add Code gen support for '->*' operator which fell
through the crack. llvm-svn: 85160
This commit is contained in:
parent
3b7ba5f35b
commit
038374f887
|
@ -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());
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue