[cfe-commits] r86040 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp test/CodeGenCXX/ptr-to-member-function.cpp

Fariborz Jahanian fjahanian at apple.com
Wed Nov 4 11:13:37 PST 2009


Author: fjahanian
Date: Wed Nov  4 13:13:37 2009
New Revision: 86040

URL: http://llvm.org/viewvc/llvm-project?rev=86040&view=rev
Log:
Add code gen for pointer-to-member function in
ctor's initializer. Fixes pr5178.


Modified:
    cfe/trunk/lib/CodeGen/CGCXX.cpp
    cfe/trunk/test/CodeGenCXX/ptr-to-member-function.cpp

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Wed Nov  4 13:13:37 2009
@@ -1421,6 +1421,8 @@
       if (FieldType->isReferenceType())
         RHS = EmitReferenceBindingToExpr(RhsExpr, FieldType,
                                         /*IsInitializer=*/true);
+      else if (FieldType->isMemberFunctionPointerType())
+        RHS = RValue::get(CGM.EmitConstantExpr(RhsExpr, FieldType, this));
       else
         RHS = RValue::get(EmitScalarExpr(RhsExpr, true));
       EmitStoreThroughLValue(RHS, LHS, FieldType);

Modified: cfe/trunk/test/CodeGenCXX/ptr-to-member-function.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ptr-to-member-function.cpp?rev=86040&r1=86039&r2=86040&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/ptr-to-member-function.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/ptr-to-member-function.cpp Wed Nov  4 13:13:37 2009
@@ -9,8 +9,14 @@
 
 struct A {
 int Ai;
+bool foo(int* arg) const;
 }; 
 
+bool A::foo(int* arg) const {
+    printf("A::foo(%d)\n", *arg);
+    return true;
+}
+
 struct B : public A {
   void bf() { printf("B::bf called\n"); }
 }; 
@@ -40,10 +46,22 @@
     g(x);
 }
 
+struct B1 {
+  bool (A::*pmf)(int*) const;
+
+  B1(int i) : pmf(&A::foo), im(i) {
+    ((A*)this->*pmf)(&im);
+  }
+
+  int im;
+};
+
 int main()
 {
 	X x;
 	test2(x);
+        B1 b = B1(1);
+  	B1 c = B1(2);
 }
 
 // CHECK-LP64: call	__ZN1XcvM1BFvvEEv





More information about the cfe-commits mailing list