[clang] 700f683 - Revert "[clang] Don't inherit dllimport/dllexport to exclude_from_explicit_instantiation members during explicit instantiation (#65961)"
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 20 07:31:35 PDT 2023
Author: Hans Wennborg
Date: 2023-09-20T16:31:12+02:00
New Revision: 700f683f9ddd64528d848cd3efef3ca7003cbd7e
URL: https://github.com/llvm/llvm-project/commit/700f683f9ddd64528d848cd3efef3ca7003cbd7e
DIFF: https://github.com/llvm/llvm-project/commit/700f683f9ddd64528d848cd3efef3ca7003cbd7e.diff
LOG: Revert "[clang] Don't inherit dllimport/dllexport to exclude_from_explicit_instantiation members during explicit instantiation (#65961)"
This uncovered a problem with virtual methods and
exclude_from_explicit_instantiation, see
https://github.com/llvm/llvm-project/issues/66909
Reverting until that's fixed.
> This is a continuation of https://reviews.llvm.org/D155713
>
> Fixes https://github.com/llvm/llvm-project/issues/40363
This reverts commit 84216d17359fcf6c314726d9f8d0416f8118d968.
Added:
Modified:
clang/lib/Sema/SemaDeclCXX.cpp
Removed:
clang/test/CodeGenCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
clang/test/SemaCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
################################################################################
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 83a5674092b2611..0091e0ecf6f3986 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -6605,13 +6605,6 @@ void Sema::checkClassLevelDLLAttribute(CXXRecordDecl *Class) {
if (!VD && !MD)
continue;
- if ((TSK == TSK_ExplicitInstantiationDeclaration ||
- TSK == TSK_ExplicitInstantiationDefinition) &&
- Member->hasAttr<ExcludeFromExplicitInstantiationAttr>()) {
- // Skip members excluded from instantiation.
- continue;
- }
-
if (MD) {
// Don't process deleted methods.
if (MD->isDeleted())
diff --git a/clang/test/CodeGenCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp b/clang/test/CodeGenCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
deleted file mode 100644
index b3c804839be1ee4..000000000000000
--- a/clang/test/CodeGenCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-windows -fms-extensions -emit-llvm -O0 -o - %s | FileCheck %s
-
-// Test that dllimport and exclude_from_explicit_instantiation work properly
-// together. Specifically, we check that when exclude_from_explicit_instantiation
-// is used on a method, the compiler doesn't expect it to be provided externally
-// even if it is marked with dllimport.
-//
-// https://github.com/llvm/llvm-project/issues/40363
-
-#define DLLIMPORT __declspec(dllimport)
-#define DLLEXPORT __declspec(dllexport)
-#define EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__((exclude_from_explicit_instantiation))
-
-template <class T>
-struct DLLIMPORT Foo {
- EXCLUDE_FROM_EXPLICIT_INSTANTIATION void x() {}
-};
-
-template <class T>
-struct Bar {
- EXCLUDE_FROM_EXPLICIT_INSTANTIATION void x() {}
-};
-
-extern template struct Foo<int>;
-extern template struct DLLIMPORT Bar<int>;
-
-
-template <class T>
-struct Baz {
- EXCLUDE_FROM_EXPLICIT_INSTANTIATION void f() {}
-};
-
-template struct DLLEXPORT Baz<int>;
-
-
-void test(Foo<int>& foo, Bar<int>& bar, Baz<int>& baz) {
- // Not imported.
- // CHECK-DAG: define linkonce_odr dso_local void @"?x@?$Foo at H@@QEAAXXZ"
- foo.x();
-
- // Not imported.
- // CHECK-DAG: define linkonce_odr dso_local void @"?x@?$Bar at H@@QEAAXXZ"
- bar.x();
-
- // Not exported.
- // CHECK-DAG: define linkonce_odr dso_local void @"?f@?$Baz at H@@QEAAXXZ"
- baz.f();
-}
diff --git a/clang/test/SemaCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp b/clang/test/SemaCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
deleted file mode 100644
index bdca2d8895f516c..000000000000000
--- a/clang/test/SemaCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-windows -fms-extensions -verify %s
-
-// Test that an entity marked as both dllimport and exclude_from_explicit_instantiation
-// isn't instantiated.
-
-#define DLLIMPORT __declspec(dllimport)
-#define EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__((exclude_from_explicit_instantiation))
-
-template <class T>
-struct DLLIMPORT Foo {
- EXCLUDE_FROM_EXPLICIT_INSTANTIATION void x();
-};
-
-template <class T>
-struct Bar {
- DLLIMPORT EXCLUDE_FROM_EXPLICIT_INSTANTIATION inline void x();
-};
-
-template <class T>
-void Foo<T>::x() { using Fail = typename T::fail; }
-
-template <class T>
-DLLIMPORT inline void Bar<T>::x() { using Fail = typename T::fail; }
-
-// expected-no-diagnostics
-template struct Foo<int>;
-template struct Bar<int>;
More information about the cfe-commits
mailing list