From 5fb3a13ba7523d3a93290bcfa033b835151c19aa Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 6 Nov 2013 19:18:55 +0000 Subject: [PATCH] Fix the -cxx-abi microsoft -mconstructor-aliases combination. On the microsoft ABI clang is producing one weak_odr and one linkonce_odr destructor, which is reasonable since only one is required. The fix is simply to move the assert past the special case treatment of linkonce_odr. llvm-svn: 194158 --- clang/lib/CodeGen/CGCXX.cpp | 4 ++-- clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 15686f7ff6ed..eeedaf106438 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -146,13 +146,13 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl, if (!InEveryTU) return true; - assert(Linkage == TargetLinkage); // Instead of creating as alias to a linkonce_odr, replace all of the uses // of the aliassee. - if (TargetLinkage == llvm::GlobalValue::LinkOnceODRLinkage) { + if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage) { Replacements[MangledName] = Aliasee; return false; } + assert(Linkage == TargetLinkage); } // Create the alias with no name. diff --git a/clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp b/clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp new file mode 100644 index 000000000000..d54520fab72c --- /dev/null +++ b/clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 -fno-rtti -mconstructor-aliases | FileCheck %s + +namespace test1 { +template class A { + ~A() {} +}; +template class A; +// CHECK: define weak_odr x86_thiscallcc void @"\01??1?$A@D@test1@@AAE@XZ" +}