[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