From cef60afe8f60893e8991c95c615bbb8c03834394 Mon Sep 17 00:00:00 2001 From: kikairoya Date: Sat, 15 Nov 2025 11:19:05 +0900 Subject: [PATCH 1/3] pretest --- clang/test/CodeGenCXX/dllexport.cpp | 1 + clang/test/CodeGenCXX/mingw-template-dllexport.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/clang/test/CodeGenCXX/dllexport.cpp b/clang/test/CodeGenCXX/dllexport.cpp index ef9d8131c511c..0c8ddc2803c89 100644 --- a/clang/test/CodeGenCXX/dllexport.cpp +++ b/clang/test/CodeGenCXX/dllexport.cpp @@ -1133,3 +1133,4 @@ class __declspec(dllexport) ACE_Service_Object : public ACE_Shared_Object {}; // MSVC2015-DAG: define weak_odr dso_local dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q // The declarations should not be exported. // MSVC2013-NOT: define weak_odr dso_local dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q +// PS-NOT: define weak_odr dllexport void @_ZN18ACE_Service_ObjectC1EOS_ diff --git a/clang/test/CodeGenCXX/mingw-template-dllexport.cpp b/clang/test/CodeGenCXX/mingw-template-dllexport.cpp index de112d6da53db..1e2759fbb5cc7 100644 --- a/clang/test/CodeGenCXX/mingw-template-dllexport.cpp +++ b/clang/test/CodeGenCXX/mingw-template-dllexport.cpp @@ -10,11 +10,13 @@ template class c { + c(c &&) noexcept {} void f() {} }; template class __declspec(dllexport) c; +// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN1cIiEC1EOS0_ // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv extern template class __declspec(dllexport) c; From 5dd04f3a507caf64fec85af028deb052b2c80a7a Mon Sep 17 00:00:00 2001 From: kikairoya Date: Sat, 15 Nov 2025 11:19:06 +0900 Subject: [PATCH 2/3] [Clang] Export inline move constructors in dllexport-ed template instantiations on non-MSVC targets Previously, even when MSVC compatibility was not requested, inline move constructors in dllexport-ed templates were not exported, which was seemingly unintended. On non-MSVC targets (MinGW, Cygwin, and PS), such move constructors should be exported consistently with copy constructors and with the behavior of modern MSVC. --- clang/lib/Sema/SemaDeclCXX.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index aa36a79142e52..5f741166d0e29 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6627,6 +6627,7 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) { auto *Ctor = dyn_cast(MD); if ((MD->isMoveAssignmentOperator() || (Ctor && Ctor->isMoveConstructor())) && + getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2010) && !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015)) continue; From 0291a3477865d23734de369fe06d291393cf7a64 Mon Sep 17 00:00:00 2001 From: kikairoya Date: Sat, 15 Nov 2025 11:19:06 +0900 Subject: [PATCH 3/3] update test --- clang/test/CodeGenCXX/dllexport.cpp | 2 +- clang/test/CodeGenCXX/mingw-template-dllexport.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/CodeGenCXX/dllexport.cpp b/clang/test/CodeGenCXX/dllexport.cpp index 0c8ddc2803c89..a34a87c5b9f21 100644 --- a/clang/test/CodeGenCXX/dllexport.cpp +++ b/clang/test/CodeGenCXX/dllexport.cpp @@ -1131,6 +1131,6 @@ class __declspec(dllexport) ACE_Shared_Object { class __declspec(dllexport) ACE_Service_Object : public ACE_Shared_Object {}; // Implicit move constructor declaration. // MSVC2015-DAG: define weak_odr dso_local dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q +// PS-DAG: define weak_odr dllexport void @_ZN18ACE_Service_ObjectC1EOS_ // The declarations should not be exported. // MSVC2013-NOT: define weak_odr dso_local dllexport {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q -// PS-NOT: define weak_odr dllexport void @_ZN18ACE_Service_ObjectC1EOS_ diff --git a/clang/test/CodeGenCXX/mingw-template-dllexport.cpp b/clang/test/CodeGenCXX/mingw-template-dllexport.cpp index 1e2759fbb5cc7..15969d2415cca 100644 --- a/clang/test/CodeGenCXX/mingw-template-dllexport.cpp +++ b/clang/test/CodeGenCXX/mingw-template-dllexport.cpp @@ -16,7 +16,7 @@ class c { template class __declspec(dllexport) c; -// CHECK-NOT: define {{.*}} dllexport {{.*}} @_ZN1cIiEC1EOS0_ +// CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiEC1EOS0_ // CHECK: define {{.*}} dllexport {{.*}} @_ZN1cIiE1fEv extern template class __declspec(dllexport) c;