]> granicus.if.org Git - clang/commitdiff
Add Code gen support for '->*' operator which fell
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 26 Oct 2009 21:58:25 +0000 (21:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 26 Oct 2009 21:58:25 +0000 (21:58 +0000)
through the crack.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85160 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGExprAgg.cpp
test/CodeGenCXX/ptr-to-datamember.cpp

index ca0d4b7c6041cc37bc20c171e4166f6541c632da..cf2a88903ba318f7109bf7b9ccf06e7e477c1d50 100644 (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());
index 5f12d427cf892d03e681ec7a0dd4e2f219e93898..901f867a5913f2d5585a8e5aca4644718b9c93c5 100644 (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");
index eee03c060f91c9d249838cec0025e3271f75d020..a7b4cc2f7afb901462d53b1010d88665f7d28f2e 100644 (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);
 }