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@H@@QEAAXXZ" - foo.x(); - - // Not imported. - // CHECK-DAG: define linkonce_odr dso_local void @"?x@?$Bar@H@@QEAAXXZ" - bar.x(); - - // Not exported. - // CHECK-DAG: define linkonce_odr dso_local void @"?f@?$Baz@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>; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits