[cfe-commits] r85160 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp lib/CodeGen/CGExprAgg.cpp test/CodeGenCXX/ptr-to-datamember.cpp

Fariborz Jahanian fjahanian at apple.com
Mon Oct 26 14:58:25 PDT 2009


Author: fjahanian
Date: Mon Oct 26 16:58:25 2009
New Revision: 85160

URL: http://llvm.org/viewvc/llvm-project?rev=85160&view=rev
Log:
Add Code gen support for '->*' operator which fell
through the crack.

Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CGExprAgg.cpp
    cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=85160&r1=85159&r2=85160&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Oct 26 16:58:25 2009
@@ -1378,7 +1378,8 @@
     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 @@
 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());

Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=85160&r1=85159&r2=85160&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Mon Oct 26 16:58:25 2009
@@ -329,7 +329,8 @@
 }
 
 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");

Modified: cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp?rev=85160&r1=85159&r2=85160&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/ptr-to-datamember.cpp Mon Oct 26 16:58:25 2009
@@ -51,6 +51,21 @@
   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 @@
   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);
 }





More information about the cfe-commits mailing list