зеркало из https://github.com/microsoft/clang-1.git
Fix bug 12574 - Avoid infinite recursion in constructors and destructors when using Microsoft C++ ABI
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155189 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
c93e014cd4
Коммит
8560791791
|
@ -717,7 +717,8 @@ void CodeGenFunction::EmitConstructorBody(FunctionArgList &Args) {
|
|||
|
||||
// Before we go any further, try the complete->base constructor
|
||||
// delegation optimization.
|
||||
if (CtorType == Ctor_Complete && IsConstructorDelegationValid(Ctor)) {
|
||||
if (CtorType == Ctor_Complete && IsConstructorDelegationValid(Ctor) &&
|
||||
CGM.getContext().getTargetInfo().getCXXABI() != CXXABI_Microsoft) {
|
||||
if (CGDebugInfo *DI = getDebugInfo())
|
||||
DI->EmitLocation(Builder, Ctor->getLocEnd());
|
||||
EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args);
|
||||
|
@ -916,7 +917,7 @@ void CodeGenFunction::EmitDestructorBody(FunctionArgList &Args) {
|
|||
// Enter the cleanup scopes for virtual bases.
|
||||
EnterDtorCleanups(Dtor, Dtor_Complete);
|
||||
|
||||
if (!isTryBody) {
|
||||
if (!isTryBody && CGM.getContext().getTargetInfo().getCXXABI() != CXXABI_Microsoft) {
|
||||
EmitCXXDestructorCall(Dtor, Dtor_Base, /*ForVirtualBase=*/false,
|
||||
LoadCXXThis());
|
||||
break;
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
|
||||
|
||||
class A {
|
||||
public:
|
||||
A() { }
|
||||
~A() { }
|
||||
};
|
||||
|
||||
void no_contstructor_destructor_infinite_recursion() {
|
||||
A a;
|
||||
|
||||
// Make sure that the constructor doesn't call itself:
|
||||
// CHECK: define {{.*}} @"\01??0A@@QAE@XZ"
|
||||
// CHECK-NOT: call void @"\01??0A@@QAE@XZ"
|
||||
// CHECK: ret
|
||||
|
||||
// Make sure that the destructor doesn't call itself:
|
||||
// CHECK: define {{.*}} @"\01??1A@@QAE@XZ"
|
||||
// CHECK-NOT: call void @"\01??1A@@QAE@XZ"
|
||||
// CHECK: ret
|
||||
}
|
Загрузка…
Ссылка в новой задаче