]> granicus.if.org Git - clang/commitdiff
Fixup codegen for static dispatch to a virtual function that was
authorMike Stump <mrs@apple.com>
Wed, 26 Aug 2009 23:38:08 +0000 (23:38 +0000)
committerMike Stump <mrs@apple.com>
Wed, 26 Aug 2009 23:38:08 +0000 (23:38 +0000)
almost correct.  :-)

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

lib/CodeGen/CGCXX.cpp
test/CodeGenCXX/virt.cpp

index c72eca278cb4b0c7174ebb6dcfb27f31b21a6cac..3c7115d6836c346470e6d47f6e20e11149b0cd6c 100644 (file)
@@ -216,7 +216,7 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
   //   Explicit qualification with the scope operator (5.1) suppresses the 
   //   virtual call mechanism.
   llvm::Value *Callee;
-  if (MD->isVirtual() && !isa<CXXQualifiedMemberExpr>(CE)) {
+  if (MD->isVirtual() && !isa<CXXQualifiedMemberExpr>(ME)) {
     Callee = BuildVirtualCall(MD, This, Ty);
   } else
     Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
index 4d63ab0a3692e88b0f01a13ce55af028293db2ad..cf7bbc17f862e15cb7eac739b23aebdb0e898b35 100644 (file)
@@ -137,8 +137,9 @@ void test12_foo() {
 // CHECK-LPOPT32-NEXT: movl (%eax), %ecx
 // CHECK-LPOPT32-NEXT: movl %eax, (%esp)
 // CHECK-LPOPT32-NEXT: call *4(%ecx)
-// FIXME: See EmitCXXMemberCallExpr
-// CHECK-LPOPT32-NEXT call __ZN8test12_A3fooEv
+// CHECK-LPOPT32-NEXT: movl _test12_pa, %eax
+// CHECK-LPOPT32-NEXT: movl %eax, (%esp)
+// CHECK-LPOPT32-NEXT: call L__ZN8test12_A3fooEv$stub
 
 // CHECK-LPOPT64:__Z10test12_foov:
 // CHECK-LPOPT64: movq _test12_pa(%rip), %rdi
@@ -159,8 +160,8 @@ void test12_foo() {
 // CHECK-LPOPT64-NEXT: movq _test12_pd(%rip), %rdi
 // CHECK-LPOPT64-NEXT: movq (%rdi), %rax
 // CHECK-LPOPT64-NEXT: call *8(%rax)
-// FIXME: See EmitCXXMemberCallExpr
-// CHECK-LPOPT64-NEXT call __ZN8test12_A3fooEv
+// CHECK-LPOPT64-NEXT: movq _test12_pa(%rip), %rdi
+// CHECK-LPOPT64-NEXT: call __ZN8test12_A3fooEv
 
 struct test6_B2 { virtual void funcB2(); char b[1000]; };
 struct test6_B1 : virtual test6_B2 { virtual void funcB1(); };