Disable devirtualization when we have covariant returns. I will open a bug

for tracking this.

llvm-svn: 159351
This commit is contained in:
Rafael Espindola 2012-06-28 15:11:39 +00:00
parent 3b33c4ecf0
commit debc71cea3
2 changed files with 37 additions and 0 deletions

View File

@ -202,6 +202,9 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE,
// we don't have support for that yet, so do a virtual call.
DevirtualizedMethod = NULL;
}
if (DevirtualizedMethod && DevirtualizedMethod->getResultType() !=
MD->getResultType())
DevirtualizedMethod = NULL;
}
llvm::Value *This;

View File

@ -152,3 +152,37 @@ namespace Test8 {
return static_cast<B*>(c)->foo();
}
}
namespace Test9 {
struct A {
int a;
};
struct B {
int b;
};
struct C : public B, public A {
};
struct RA {
virtual A *f() {
return 0;
}
};
struct RC final : public RA {
virtual C *f() {
C *x = new C();
x->a = 1;
x->b = 2;
return x;
}
};
// CHECK: define {{.*}} @_ZN5Test91fEPNS_2RCE
A *f(RC *x) {
// FIXME: It should be possible to devirtualize this case, but that is
// not implemented yet.
// CHECK: getelementptr
// CHECK-NEXT: %[[FUNC:.*]] = load
// CHECK-NEXT: bitcast
// CHECK-NEXT: = call {{.*}} %[[FUNC]]
return static_cast<RA*>(x)->f();
}
}