diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index cc7bc3b735898..44b9acdee6264 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1892,9 +1892,7 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, llvm::Comdat *C = nullptr; if (!VFTableComesFromAnotherTU && - (llvm::GlobalValue::isWeakForLinker(VFTableLinkage) || - (llvm::GlobalValue::isLocalLinkage(VFTableLinkage) && - VTableAliasIsRequred))) + llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) C = CGM.getModule().getOrInsertComdat(VFTableName.str()); // Only insert a pointer into the VFTable for RTTI data if we are not diff --git a/clang/test/CodeGenCXX/ms-local-vft-alias-comdat.cpp b/clang/test/CodeGenCXX/ms-local-vft-alias-comdat.cpp new file mode 100644 index 0000000000000..7eaa05c02c102 --- /dev/null +++ b/clang/test/CodeGenCXX/ms-local-vft-alias-comdat.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -fcxx-exceptions -triple=x86_64-windows-msvc \ +// RUN: -Wmicrosoft-template -fms-compatibility -emit-llvm %s -o - \ +// RUN: | FileCheck %s + +template struct T { + virtual void c(); + T(a h) {} +}; +struct m { + template void ab(j ac) { + using ad = T; + ad j(ac); + } +}; +template struct n { + template n(j ac) { q.ab(ac); } + ae q; +}; +class s : n { + using ag = n; +public: + template s(j ac) : ag(ac) {} +}; +struct ah { + ah(s); +} a([]{}); + +//CHECK: @0 = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4?$T@V@@@@6B@", ptr @"?c@?$T@V@@@@UEAAXXZ"] } +//CHECK: @"??_7?$T@V@@@@6B@" = internal unnamed_addr alias ptr, getelementptr inbounds ({ [2 x ptr] }, ptr @0, i32 0, i32 0, i32 1) +//CHECK-NOT : "??_7?$e@V@@@@6B@" = comdat any diff --git a/clang/test/CodeGenCXX/type-metadata.cpp b/clang/test/CodeGenCXX/type-metadata.cpp index b93c4288bb9a5..4ddfc3c2e3a8f 100644 --- a/clang/test/CodeGenCXX/type-metadata.cpp +++ b/clang/test/CodeGenCXX/type-metadata.cpp @@ -125,9 +125,9 @@ // MS-TYPEMETADATA: comdat($"??_7B@@6B0@@"), !type [[B8:![0-9]+]] // MS-TYPEMETADATA: comdat($"??_7B@@6BA@@@"), !type [[A8]] // MS-TYPEMETADATA: comdat($"??_7C@@6B@"), !type [[A8]] -// MS-TYPEMETADATA: comdat($"??_7D@?A0x{{[^@]*}}@@6BB@@@"), !type [[B8]], !type [[D8:![0-9]+]] -// MS-TYPEMETADATA: comdat($"??_7D@?A0x{{[^@]*}}@@6BA@@@"), !type [[A8]] -// MS-TYPEMETADATA: comdat($"??_7FA@?1??foo@@YAXXZ@6B@"), !type [[A8]], !type [[FA8:![0-9]+]] +// MS-TYPEMETADATA: private unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr @"??_R4D@?{{.*}}@@6BB@@@", ptr @"?g@B@@UEAAXXZ", ptr @"?h@D@?{{.*}}@@UEAAXXZ"] }, !type [[B8]], !type [[D8:![0-9]+]] +// MS-TYPEMETADATA: private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4D@?{{.*}}@@6BA@@@", ptr @"?f@D@?{{.*}}@@$4PPPPPPPM@A@EAAXXZ"] }, !type !0 +// MS: private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4FA@?1??foo@@YAXXZ@6B@", ptr @"?f@FA@?1??foo@@YAXXZ@UEAAXXZ"] }, !type !0, !type [[FA8:![0-9]+]] struct A { A();