llvm-project/clang/test/CodeGenCXX/dllimport-unique-external.cpp
Wolfgang Pieb 477f9cea77 [MSCV][dllexport/dllimport][PS] Allow UniqueExternal linkage classes with dllexport/dllimport
MSVC allows instantiations of exported or imported template classes with template
parameters that have internal linkage. Clang now allows it in Microsoft mode and for
the Playstation platform. This partially addresses issue 56068.

Note that MSVC also allows explicit dllexport/dllimport attributes on classes
with internal linkage (e.g. local classes or classes declared in anonymous name spaces).
Clang continues to reject such declarations.

Reviewed By: hans

Differential Revision: https://reviews.llvm.org/D146338
2023-03-29 18:15:04 +00:00

35 lines
1.6 KiB
C++

// RUN: %clang_cc1 -no-enable-noundef-analysis -triple i686-windows-msvc -emit-llvm -std=c++1y -fno-threadsafe-statics -fms-extensions -O0 -disable-llvm-passes -o - %s | FileCheck --check-prefix=MSC %s
// RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-scei-ps4 -emit-llvm -std=c++1y -fno-threadsafe-statics -fms-extensions -O0 -o - %s | FileCheck --check-prefix=PS %s
// RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-sie-ps5 -emit-llvm -std=c++1y -fno-threadsafe-statics -fms-extensions -O0 -o - %s | FileCheck --check-prefix=PS %s
template <typename T> struct __declspec(dllimport) ImportedClassTemplate { void func(); };
// Make sure that we do not import classes with unique external linkage.
// Note that MSVC does indeed expect the called function to be defined elsewhere.
void func1() {
class LocalCRTP : public ImportedClassTemplate<LocalCRTP> {};
LocalCRTP lc;
lc.func();
}
namespace {
class AnonNSCRTP : public ImportedClassTemplate<AnonNSCRTP> {};
AnonNSCRTP ac;
}
void func2() {
ac.func();
}
// MSC-NOT: declare {{.*}}dllimport
// MSC: call {{.*}}@"?func@?$ImportedClassTemplate@VLocalCRTP@?1??func1{{.*}}"
// MSC-NOT: declare {{.*}}dllimport
// MSC: call {{.*}}@"?func@?$ImportedClassTemplate@VAnonNSCRTP@?{{.*}}"
// MSC-NOT: declare {{.*}}dllimport
// PS-NOT: declare {{.*}}dllimport
// PS: call {{.*}}@_ZN21ImportedClassTemplateIZ5func1vE9LocalCRTPE4funcEv
// PS-NOT: declare {{.*}}dllimport
// PS: call {{.*}}@_ZN21ImportedClassTemplateIN12_GLOBAL__N_110AnonNSCRTPEE4funcEv
// PS-NOT: declare {{.*}}dllimport