зеркало из https://github.com/microsoft/clang-1.git
Disable devirtualization when we have covariant returns. I will open a bug
for tracking this. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159351 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
ea01d76617
Коммит
4a889e47bd
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче