-
Notifications
You must be signed in to change notification settings - Fork 11.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[clang] Don't inherit dllimport/dllexport to exclude_from_explicit_in…
…stantiation members during explicit instantiation (#65961) This is a continuation of https://reviews.llvm.org/D155713 Fixes #40363
- Loading branch information
Showing
3 changed files
with
82 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
clang/test/CodeGenCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// 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(); | ||
} |
27 changes: 27 additions & 0 deletions
27
clang/test/SemaCXX/attr-exclude_from_explicit_instantiation.dllimport.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// 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>; |