From f0092f48ab86f842825113a8104f051ee2a4b63b Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Fri, 11 Apr 2014 19:36:51 +0000 Subject: Merging r203007: ------------------------------------------------------------------------ r203007 | rafael.espindola | 2014-03-05 16:04:41 -0500 (Wed, 05 Mar 2014) | 4 lines Don't produce an alias between destructors with different calling conventions. Fixes pr19007. ------------------------------------------------------------------------ llvm-svn: 206059 --- clang/lib/CodeGen/CGCXX.cpp | 6 ++++++ clang/test/CodeGenCXX/ctor-dtor-alias.cpp | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index cfb2d629..2f8a17a 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -92,7 +92,13 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) { if (!ClassLayout.getBaseClassOffset(UniqueBase).isZero()) return true; + // Give up if the calling conventions don't match. We could update the call, + // but it is probably not worth it. const CXXDestructorDecl *BaseD = UniqueBase->getDestructor(); + if (BaseD->getType()->getAs()->getCallConv() != + D->getType()->getAs()->getCallConv()) + return true; + return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base), GlobalDecl(BaseD, Dtor_Base), false); diff --git a/clang/test/CodeGenCXX/ctor-dtor-alias.cpp b/clang/test/CodeGenCXX/ctor-dtor-alias.cpp index 235d165..d8d1fab 100644 --- a/clang/test/CodeGenCXX/ctor-dtor-alias.cpp +++ b/clang/test/CodeGenCXX/ctor-dtor-alias.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s -// RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s +// RUN: %clang_cc1 %s -triple i686-linux -emit-llvm -o - -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s +// RUN: %clang_cc1 %s -triple i686-linux -emit-llvm -o - -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s // RUN: %clang_cc1 -cc1 -triple x86_64--netbsd -emit-llvm \ // RUN: -mconstructor-aliases -O2 %s -o - | FileCheck --check-prefix=CHECK-RAUW %s @@ -133,6 +133,22 @@ namespace test8 { zed foo; } +namespace test9 { +struct foo { + __attribute__((stdcall)) ~foo() { + } +}; + +struct bar : public foo {}; + +void zed() { + // Test that we produce a call to bar's destructor. We used to call foo's, but + // it has a different calling conversion. + // CHECK-DAG: call void @_ZN5test93barD2Ev + bar ptr; +} +} + // CHECK-RAUW: @_ZTV1C = linkonce_odr unnamed_addr constant [4 x i8*] [{{[^@]*}}@_ZTI1C {{[^@]*}}@_ZN1CD2Ev {{[^@]*}}@_ZN1CD0Ev {{[^@]*}}] // r194296 replaced C::~C with B::~B without emitting the later. -- cgit v1.1